summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Remove unneeded codeJason Zaugg2015-09-031-5/+3
| | | | Move misplaced and malindented comment and remove two lines of unneeded code.
* Use the presentation compiler to drive REPL tab completionJason Zaugg2015-09-0211-53/+317
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The old implementation is still avaiable under a flag, but we'll remove it in due course. Design goal: - Push as much code in src/interactive as possible to enable reuse outside of the REPL - Don't entangle the REPL completion with JLine. The enclosed test case drives the REPL and autocompletion programatically. - Don't hard code UI choices, like how to render symbols or how to filter candidates. When completion is requested, we wrap the entered code into the same "interpreter wrapper" synthetic code as is done for regular execution. We then start a throwaway instance of the presentation compiler, which takes this as its one and only source file, and has a classpath formed from the REPL's classpath and the REPL's output directory (by default, this is in memory). We can then typecheck the tree, and find the position in the synthetic source corresponding to the cursor location. This is enough to use the new completion APIs in the presentation compiler to prepare a list of candidates. We go to extra lengths to allow completion of partially typed identifiers that appear to be keywords, e.g `global.def` should offer `definitions`. Two secret handshakes are included; move the the end of the line, type `// print<TAB>` and you'll see the post-typer tree. `// typeAt 4 6<TAB>` shows the type of the range position within the buffer. The enclosed unit test exercises most of the new functionality.
* Add a convenience method to Symbol to "resugar" fieldsJason Zaugg2015-09-021-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | val and var members of classes are split into getter/setter and field symbols. However, we can't call `defString` on any of these and see what existed in source code. Example: ``` scala> class X { protected var x: Int = 0 } defined class X scala> val xField = typeOf[X].member(TermName("x ")) xField: $r.intp.global.Symbol = variable x scala> xField.defString res10: String = private[this] var x: Int scala> xField.getterIn(xField.owner).defString res11: String = protected def x: Int scala> xField.setterIn(xField.owner).defString res12: String = protected def x_=(x$1: Int): Unit ``` This commit introduces a new method on `Symbol` that pieces together the information from these symbols to create an artificial symbol that has the `defString` we're after: ``` scala> xField.sugaredSymbolOrSelf.defString res14: String = protected var x: Int ```
* Publicize method in the presentation compilerJason Zaugg2015-09-021-1/+1
|
* Add a higher level completion API to the pres compilerJason Zaugg2015-09-021-1/+77
| | | | | | | | | | | | | | | | | Conveniences added: - The client need not determine ahead of time whether it wants scope completions of type member completions, this is inferred from the tree at the cursor - Computes the delta from the cursor to point where a suggested completion item should be written. This includes finding the position of the name within a Select node, which is tricky. - Includes a matcher that matches results base on prefix, accessibility and suitability in the syntactic location. Type members are not offered in term positions, and term members only offered in type position if they could for a prefix for a type. E.g. `type T = glob<TAB>` should offer `global` to help writing `global.Tree`.
* Add an option to let pres compiler user manage threadingJason Zaugg2015-09-022-3/+4
| | | | | | | | | | | | The presentation compiler currently demands that all interaction is performed by asynchronous submission of work items, which are queued and executed on the presentation compiler thread. This is fairly inconvenient if you are a known-single-threaded client that is trying to use the compiler from your own thread. This commit adds an option to disable "assertCorrectThread" to better support this use case.
* SI-5408 Prompt after incomplete script pasteSom Snytt2015-09-022-66/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Transcript paste mode invites the user to keep typing like regular paste mode, but really you must enter more transcript. This matters if the script ends in the middle of incomplete code that the user wants to complete by hand. Previously, ``` scala> scala> def f() = { // Detected repl transcript paste: ctrl-D to finish. // Replaying 1 commands from transcript. scala> def f() = { scala> scala> def f() = { // Detected repl transcript paste: ctrl-D to finish. | } // Replaying 1 commands from transcript. scala> def f() = { } f: ()Unit ``` Now, ``` scala> scala> def f() = { // Detected repl transcript. Paste more, or ctrl-D to finish. // Replaying 1 commands from transcript. scala> def f() = { | 42 | } f: ()Int scala> f() res0: Int = 42 ```
* Update power mode bannerSom Snytt2015-09-022-24/+26
| | | | | | | | | | | The classic banner is available under -Dscala.repl.power.banner=classic. ``` scala> :power Power mode enabled. :phase is at typer. import scala.tools.nsc._, intp.global._, definitions._ Try :help or completions for vals._ and power._ ```
* SI-4438 FindAll implicits after errorJason Zaugg2015-09-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix cross talk between candidates in ImplicitComputation#findAll. Haoyi reported that he couldn't get the presentation compiler to offer completion suggestions for extension methods on primitive arrays. Turns out that an error in typechecking the previous candidate had not been cleared, and this was taken to mean that `arrayIntOps` was itself ineligible. After this patch: ``` scala> Array(1, 2, 3) reverse reverseIterator reverse reverseMap reversed scala> Array(1,2,3).reverse //print scala.Predef.intArrayOps(scala.Array.apply(1, 2, 3)).reverse scala> Array(1, 2, 3) to toString toCollection toSeq toIterator to toMap toSet toList toArray toBuffer toStream toIterable toTraversable toVector toIndexedSeq scala> Array(1, 2, 3) toSeq override def toSeq: Seq[Int] ```
* Merge pull request #4692 from JanBessai/Fix-SI-6636Adriaan Moors2015-08-312-0/+23
|\ | | | | SI-6636 Fix macro expansion in toolboxes
| * SI-6636 Fix macro expansion in toolboxesJan Bessai2015-08-232-0/+23
| |
* | Merge pull request #4707 from fthomas/topic/pins-linkLukas Rytz2015-08-281-2/+3
|\ \ | | | | | | Add link to online version of Programming in Scala
| * | Add link to online version of Programming in ScalaFrank S. Thomas2015-08-241-2/+3
| | |
* | | Merge pull request #4710 from retronym/ticket/9450Seth Tisue2015-08-271-2/+4
|\ \ \ | | | | | | | | SI-9450 Fix triple quoted strings in REPL :power mode
| * | | SI-9450 Fix triple quoted strings in REPL :power modeJason Zaugg2015-08-271-2/+4
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some extra synthetic code generated under this mode failed to escape input before adding it to a literal string. It used to get away with this most of the time by triple quoting the literal. This commit reuses Scala string escaping logic buried in `Constant` to do this properly. Actually, the proper approach would be to build the synthetic code with trees and quasiquotes, and avoid the mess of stringly-genererated code. I threw in some defensive hygiene for the reference to `Nil` while I was in the neighbourhood.
* / / SI-8346 Re-established soundness of toSet (element type widening)Rex Kerr2015-08-265-5/+43
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | toSet needs to rebuild some child classes, but not others, as toSet is allowed to widen element types (which the invariant Set normally cannot do), and some sets rely upon their invariance. Thus, sets that rely upon their invariance now rebuild themselves into a generic set upon toSet, while those that do not just sit there. Note: there was a similar patch previously that fixed the same problem, but this is a reimplementation to circumvent license issues. Note: the newBuilder method was benchmarked as (surprisingly!) the most efficient way to create small sets, so it is used where sets may need to be rebuild.
* | Fix typo in the name of a private methodMichał Pociecha2015-08-231-5/+5
| | | | | | | | Since it's a private method, it's safe to just rename it.
* | Fix typos in spec, docs and commentsMichał Pociecha2015-08-2319-23/+23
| |
* | Merge pull request #4693 from scala/revert-3791-ticket/8346Seth Tisue2015-08-203-24/+6
|\ \ | | | | | | Revert "SI-8346 Rebuild invariant sets in #toSet, avoiding CCE"
| * | Revert "SI-8346 Rebuild invariant sets in #toSet, avoiding CCE"Adriaan Moors2015-08-183-24/+6
| |/
* | Merge pull request #4697 from martijnhoekstra/patch-3Seth Tisue2015-08-191-2/+2
|\ \ | | | | | | Fix documentation of Stream.filter introduced in 13f30c
| * | Fix documentation of filter introduced in 13f30cmartijnhoekstra2015-08-191-2/+2
| |/
* / Fix method name reference in Predef documentationJanek Bogucki2015-08-191-1/+1
|/
* Merge pull request #4678 from stusmall/2.11.xLukas Rytz2015-08-101-0/+4
|\ | | | | Improved error message for "filename too long" build errors
| * SI-3623 Improved error message for "filename too long" build errorsstusmall2015-08-071-0/+4
| | | | | | | | | | | | | | | | When building on ecryptfs filenames can be limited to ~142 characters. This limit doesn't take long to hit and can leave the the user with a hard to diagnosis error message. Some legacy file systems will have similarly small limits. This just adds a hint that the error might be related to the underlying fs.
* | Merge pull request #4688 from retronym/topic/typer-debug-implicitsLukas Rytz2015-08-102-3/+5
|\ \ | | | | | | Fix tracing of implicit search under -Ytyper-debug
| * | Fix tracing of implicit search under -Ytyper-debugJason Zaugg2015-08-062-3/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The log messages intented to chronicle implicit search were always being filtered out by virtue of the fact that the the tree passed to `printTyping` was already typed, (e.g. with an implicit MethodType.) This commit enabled printing in this case, although it still filters out trees that are deemed unfit for typer tracing, such as `()`. In the context of implicit search, this happens to filter out the noise of: ``` | | | [search #2] start `()`, searching for adaptation to pt=Unit => Foo[Int,Int] (silent: value <local Test> in Test) implicits disabled | | | [search #3] start `()`, searching for adaptation to pt=(=> Unit) => Foo[Int,Int] (silent: value <local Test> in Test) implicits disabled | | | \-> <error> ``` ... which I think is desirable. The motivation for this fix was to better display the interaction between implicit search and type inference. For instance: ``` class Foo[A, B] class Test { implicit val f: Foo[Int, String] = ??? def t[A, B](a: A)(implicit f: Foo[A, B]) = ??? t(1) } ``` ```` % scalac -Ytyper-debug sandbox/instantiate.scala ... | |-- t(1) BYVALmode-EXPRmode (site: value <local Test> in Test) | | |-- t BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value <local Test> in Test) | | | [adapt] [A, B](a: A)(implicit f: Foo[A,B])Nothing adapted to [A, B](a: A)(implicit f: Foo[A,B])Nothing | | | \-> (a: A)(implicit f: Foo[A,B])Nothing | | |-- 1 BYVALmode-EXPRmode-POLYmode (site: value <local Test> in Test) | | | \-> Int(1) | | solving for (A: ?A, B: ?B) | | solving for (B: ?B) | | [search #1] start `[A, B](a: A)(implicit f: Foo[A,B])Nothing` inferring type B, searching for adaptation to pt=Foo[Int,B] (silent: value <local Test> in Test) implicits disabled | | [search #1] considering f | | [adapt] f adapted to => Foo[Int,String] based on pt Foo[Int,B] | | [search #1] solve tvars=?B, tvars.constr= >: String <: String | | solving for (B: ?B) | | [search #1] success inferred value of type Foo[Int,=?String] is SearchResult(Test.this.f, TreeTypeSubstituter(List(type B),List(String))) | | |-- [A, B](a: A)(implicit f: Foo[A,B])Nothing BYVALmode-EXPRmode (site: value <local Test> in Test) | | | \-> Nothing | | [adapt] [A, B](a: A)(implicit f: Foo[A,B])Nothing adapted to [A, B](a: A)(implicit f: Foo[A,B])Nothing | | \-> Nothing ```
* | | Merge pull request #4620 from lastland/patch-1Seth Tisue2015-08-071-1/+2
|\ \ \ | | | | | | | | Fix the bug in the example in scala.sys.process
| * | | Wait until the cat process is finished.Li Yao2015-08-071-1/+2
| | | |
| * | | Fix the bug in the example in scala.sys.processLi Yao2015-07-111-1/+1
| | | | | | | | | | | | There's no `!` method with argument type `ProcessIO`. I suppose this is intended to be `run`.
* | | | Merge pull request #4443 from adriaanm/abstractpromise-avoid-unsafeSeth Tisue2015-08-061-30/+7
|\ \ \ \ | | | | | | | | | | SI-8362: AbstractPromise extends AtomicReference, avoids sun.misc.Unsafe
| * | | | SI-8362: AbstractPromise extends AtomicReferenceMariot Chauvin2015-07-291-30/+7
| | |_|/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To avoid `sun.misc.Unsafe`, which is not supported on Google App Engine. Deprecate `AbstractPromise` --> extend `j.u.c.atomic.AtomicReference` directly. `AtomicReference.compareAndSet()` should also provide better performance on HotSpot, which compiles it down to the machine's CAS instruction. The binary incompatible change is ok because it's in an internal package. I can't think of any real issue with adding a superclass (which contributes only final methods) to a class in an implementation package (as long as those methods were not introduced in any illicit subclasses of said class). Instead of changing `DefaultPromise`'s super class, let's be more conservative, and do it closest to the source. This is both clearer and more focussed, leaving those subclasses of AbstractPromise we never heard of unaffected. Genesis of the commit: since the work on `Future` performance, `AbstractPromise` is using `Unsafe`, breaking the ability for `Future` to be executed on GAE. At that time, viktorklang suggested to implement a fallback in case `Unsafe` is not available. carey proposed an implementation, and mchv submitted a patch, which was refined by adriaanm.
* | | | Merge pull request #4554 from som-snytt/issue/1931Seth Tisue2015-08-062-11/+23
|\ \ \ \ | | | | | | | | | | SI-1931 Hide Predef.any2stringadd in REPL
| * | | | SI-1931 Hide Predef.any2stringadd in REPLSom Snytt2015-07-062-11/+23
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | User imports that reference Predef are relocated to the top of the wrapping template so that they can hide implicits defined in Predef. Only one import from Predef is retained for special treatment. This is simple and sane. The test shows that `import Predef._` restores Predef implicits even if a user-defined term would normally be in scope. A smart `:import` command to turn off or quarantine imports explicitly would allow fine-grained control.
* | | | Merge pull request #4672 from janekdb/2.11.x-scaladoc-compilerSeth Tisue2015-08-0610-21/+21
|\ \ \ \ | | | | | | | | | | ScalaDoc fixes for compiler
| * | | | ScalaDoc fixes for compilerJanek Bogucki2015-07-2910-21/+21
| | |/ / | |/| |
* | | | Merge pull request #4675 from retronym/ticket/9425Seth Tisue2015-08-061-1/+2
|\ \ \ \ | | | | | | | | | | SI-9425 Leave Companion.apply if constructor is less accessible
| * | | | SI-9425 Leave Companion.apply if constructor is less accessibleJason Zaugg2015-07-311-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Calls to synthetic case class apply methods are inlined to the underlying constructor invocation in refchecks. However, this can lead to accessibility errors if the constructor is private. This commit ensures that the constructor is at least as accessible as the apply method before performing this tranform. I've manually checked that other the optimization still works in other cases: scala> class CaseApply { Some(42) } defined class CaseApply scala> :javap -c CaseApply Compiled from "<console>" public class CaseApply { public CaseApply(); Code: 0: aload_0 1: invokespecial #9 // Method java/lang/Object."<init>":()V 4: new #11 // class scala/Some 7: dup 8: bipush 42 10: invokestatic #17 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer; 13: invokespecial #20 // Method scala/Some."<init>":(Ljava/lang/Object;)V 16: pop 17: return }
* | | | | Merge pull request #4684 from janekdb/2.11.x-unit-return-in-mapSeth Tisue2015-08-061-1/+1
|\ \ \ \ \ | | | | | | | | | | | | Stop mapping to Unit when executing finally code.
| * | | | | Stop mapping to Unit when executing finally code.Janek Bogucki2015-08-051-1/+1
| | |_|_|/ | |/| | | | | | | | | | | | | Finally.invoke has result type Unit so foreach is sufficient here.
* / | | | Avoid unnecessary implicit view on StringJanek Bogucki2015-08-051-2/+2
|/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Using length instead of size on String to avoid a conversion call. This dump confirms there is a conversion to StringOps when using size. object StringSize { val s = "hi" println(s.size) } $ scalac -Xprint:typer StringSize.scala [[syntax trees at end of typer]] // StringSize.scala package <empty> { object StringSize extends scala.AnyRef { def <init>(): StringSize.type = { StringSize.super.<init>(); () }; private[this] val s: String = "hi"; <stable> <accessor> def s: String = StringSize.this.s; scala.this.Predef.println(scala.this.Predef.augmentString(StringSize.this.s).size) } }
* | / / Delegate null test to OptionJanek Bogucki2015-08-044-41/+11
| |/ / |/| | | | | | | | | | | Option(null) is None while Option(v) is Some(v) which makes the null test redundant.
* | | Merge pull request #4670 from retronym/ticket/9422Lukas Rytz2015-07-291-3/+5
|\ \ \ | |/ / |/| | SI-9422 Fix incorrect constant propagation
| * | SI-9422 Fix incorrect constant propagationJason Zaugg2015-07-291-3/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The ConstantOptimization phase uses abstract interpretation to track what is known about values, and then to use this information to optimize away tests with a statically known result. Constant propagation was added under -optimize in Scala 2.11.0-M3, in PR #2214. For example, we might know that a variable must hold one of a set of values (`Possible`). Or, we could track that it must *not* be of of a set of value (`Impossible`). The test case in the bug report was enough to create comparison: v1 == v2 // where V1 = Possible(Set(true, false)) // V2 = Possible(Set(true, false)) This test was considered to be always true, due to a bug in `Possible#mightNotEqual`. The only time we can be sure that `Possible(p1) mightNotEquals Possible(p2)` is if `p1` and `p2` are the same singleton set. This commit changes this method to implement this logic. The starting assumption for all values is currently `Impossible(Set())`, although it would also be reasonable to represent an unknown boolean variable as `Possible(Set(true, false))`, given the finite and small domain. I tried to change the starting assumption for boolean locals in exactly this manner, and that brings the bug into sharp focus. Under this patch: https://github.com/retronym/scala/commit/e564fe522d This code: def test(a: Boolean, b: Boolean) = a == b Compiles to: public boolean test(boolean, boolean); Code: 0: iconst_1 1: ireturn Note: the enclosed test case does not list `-optimize` in a `.flags` file, I'm relying on that being passed in by the validation build. I've tested locally with that option, though.
* | | Merge pull request #4669 from janekdb/2.11.x-scaladoc-reflectJason Zaugg2015-07-298-13/+12
|\ \ \ | | | | | | | | ScalaDoc fixes for reflect
| * | | ScalaDoc fixes for reflectJanek Bogucki2015-07-288-13/+12
| | | |
* | | | Merge pull request #4667 from janekdb/2.11.x-scaladoc-library-library-auxJason Zaugg2015-07-297-9/+9
|\ \ \ \ | |/ / / |/| | | ScalaDoc fixes for library and library-aux
| * | | ScalaDoc fixes for library and library-auxJanek Bogucki2015-07-287-9/+9
| | | |
* | | | Merge pull request #4661 from retronym/ticket/9365Lukas Rytz2015-07-281-1/+1
|\ \ \ \ | | | | | | | | | | SI-9365 Don't null out dependencies of transient lazy vals
| * | | | SI-9365 Don't null out dependencies of transient lazy valsJason Zaugg2015-07-271-1/+1
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As per Iulian's analysis: > When lazy vals are transient, the optimization in SI-720 is invalid, > leading to NPEs. These NPEs appear when recomputing the lazy val when deserializaing the object. This commit disables the field nulling if the lazy val is marked transient. The post-mixin tree in the enclosed test changes as follows: ``` --- sandbox/old.log 2015-07-27 15:48:03.000000000 +1000 +++ sandbox/new.log 2015-07-27 15:47:56.000000000 +1000 @@ -1,61 +1,54 @@ [[syntax trees at end of mixin]] // t9365.scala package <empty> { class Test extends Object with Serializable { @transient @volatile private[this] var bitmap$trans$0: Boolean = false; private def foo$lzycompute(): Object = { { Test.this.synchronized({ if (Test.this.bitmap$trans$0.unary_!()) { Test.this.foo = Test.this.x.apply(); Test.this.bitmap$trans$0 = true; () }; scala.runtime.BoxedUnit.UNIT }); - Test.this.x = null + () }; Test.this.foo }; ``` In addition to the test from the ticket, I've added a reflection based test that directly tests the nulling. This complements the test added in 449f2a7473, the fix for SI-720, which passes by virtue of not exhausting the heap.