summaryrefslogtreecommitdiff
path: root/src/reflect
Commit message (Collapse)AuthorAgeFilesLines
...
| * | | | SI-8143 Regressions with override checks, private membersJason Zaugg2014-01-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These regressed in e609f1f20b, which excluded all private methods from overriding checks. We should only exclude private[this] members on the low end of a pair, as was done before that commit, and, we must also exclude private members on the high side. Why? Warning: reverse engineered intuition follows. We need to report an error when if a private method in a subclass has matches a less-private method in the super class and report an error, lest the user be fooled into thinking it might be invoked virtually. On the other hand, adding a private method to a super class shouldn't invalidate the choice names of public members in its superclasses. I've removed the test case added by that commit and will lodge a reworked version of it that Paul provided as a new issue. That shows a bug with qualified private + inheritance. In addition, the expectation of `neg/accesses.check` is reverted to its 2.10.3 version, which I believe is correct. When it was changed in e609f1f20b it sprouted a variation, `neg/accesses-2`, which has now changed behaviour. The intent of that test will be captured in the aforementioned issue covering qualified private inheritance.
* | | | | SI-8205 Don't include CR in lineSom Snytt2014-01-291-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | More penance. Extend the unit test and don't include CR in the line text. This is obvious, which shows how dangerous it is to refactor without unit tests. My very favorite bugs are off-by-one and EOL handling, followed closely by off-by-Int.MaxValue.
* | | | | Merge pull request #3427 from retronym/ticket/8205Jason Zaugg2014-01-291-3/+3
|\ \ \ \ \ | | | | | | | | | | | | Avoid long, slow march to AIIOBE in SourceFile#lineContent
| * | | | | SI-8205 Avoid long, slow march to AIIOBE in SourceFile#lineContentJason Zaugg2014-01-291-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixing a regression from SI-8015. The failure mode is kind of amusing: a while loop in `lineToString` would count all the way to `Int.MaxValue`, and integer overflow would foil a bounds check when looking for the 'LF' in 'CR'-'LF'. Given that we're not a style checker to enforce that source files end in a new-line, this commit accounts for EOF, and fixed the overflow problem too. A JUnit test exercises the bug and a few other variations of `lineContent`. While i was in the neighbourhood, I opted for a more efficient means to slice out that line.
* | | | | | Merge pull request #3426 from retronym/ticket/8199Grzegorz Kossakowski2014-01-291-4/+7
|\ \ \ \ \ \ | | | | | | | | | | | | | | SI-8199 Account for module class suffix in -Xmax-classfile-name
| * | | | | | SI-8199 Account for module class suffix in -Xmax-classfile-nameJason Zaugg2014-01-291-4/+7
| |/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The class file name of an inner class is based on the flattened name of its owner chain. But, if this is going to be unreasonably long, it is shortened with the help of a MD5 hash. However, after this shortening takes place, we sneakily add one more character (the infamous '$') to the name when it is used for the module class. It is thus possible to exceed the limit by one. The enclosed test failed on Mac with "filename too long" because of this. I have also tested for trait implementatation classes, but these seem to be suffixed with "$class" before the name compactification runs, so they weren't actually a problem. This change is binary incompatible as separately compiled defintions and usages of named, inner classes need to agree on this setting. Most typically, however, these long names crop up for inner anonymous classes / functions, which are not prone to the binary incompatiblity, assuming that their creation hasn't be inlined to a separately compiled client.
* | | | | | Merge pull request #3374 from densh/si/6844-8076Jason Zaugg2014-01-293-26/+53
|\ \ \ \ \ \ | | | | | | | | | | | | | | SI-6844 SI-8076 improve handling of function parameters in quasiquotes
| * | | | | | SI-8076 improve support for implicit argument listDenys Shabalin2014-01-163-0/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds support for construction and deconstruction of implicit argument list which was originally suggested by @cvogt. 1. Splicing vale into implicit argument list automatically adds implicit flag to them: val x = q"val x: Int" q"def foo(implicit $x)" // <=> q"def foo(implicit x: Int)" 2. One might extract implicit argument list separately from other argument lists: val q”def foo(...$argss)(implicit ..$impl)" = q"def foo(implicit x: Int) // argss is Nil, impl contains valdef for x But this doesn't require you to always extract it separatly: val q”def foo(...$argss)" = q"def foo(implicit x: Int) // argss contains valdef for x
| * | | | | | SI-6844 restrict splicing in parameter positionDenys Shabalin2014-01-163-26/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously were a bit too permissive on how splicing in function parameter position worked. This made confusing things like possible: val x = TermName(“x”) q”def foo($x)” Now you can either splice trees in that position (ValDefs) or you have to provide type if you splice a name.
* | | | | | | Merge pull request #3402 from densh/si/7275Eugene Burmako2014-01-297-8/+57
|\ \ \ \ \ \ \ | |_|/ / / / / |/| | | | | | SI-7275 allow flattening of blocks with ..$
| * | | | | | Addresses feedback from JasonDenys Shabalin2014-01-272-10/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. Adds tests for new synthetic unit stripping. 2. Marks implementation-specific parts of Holes as private. 3. Trims description of iterated method a bit. 4. Provides a bit more clear wrapper for q interpolator. 5. Refactors SyntacticBlock, adds documentation. 6. Makes q"{ ..$Nil }" return q"" to be consist with extractor.
| * | | | | | Address pull request feedbackDenys Shabalin2014-01-231-1/+1
| | | | | | |
| * | | | | | SI-7275 allow flattening of blocks with ..$Denys Shabalin2014-01-233-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit extends current splicing rules to allow flattening of trees into other trees. Without such support it is impossible to correctly create vals with patterns and use it in other location as they could expand into multiple-statement blocks: scala> q"val (a, b) = (1, 2)" res0: reflect.runtime.universe.Tree = { <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2): @scala.unchecked match { case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) }; val a = x$1._1; val b = x$1._2; () } scala> q"..$res0; println(a + b)" res1: reflect.runtime.universe.Tree = { <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2): @scala.unchecked match { case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) }; val a = x$1._1; val b = x$1._2; println(a.$plus(b)) }
| * | | | | | Refactor reification of high-cardinality holesDenys Shabalin2014-01-231-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | New approach makes iterated function much more clear through aggressive code reuse, recursion and large descriptive comment on top of it.
| * | | | | | Tag synthetic unit with attachmentDenys Shabalin2014-01-234-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This makes it easy to differentiate unit inserted by a compiler vs unit written by the user. Useful for quasiquotes and pretty printing. Additionally SyntacticBlock extractor is changed to treat EmptyTree as zero-element block.
* | | | | | | Merge pull request #3414 from xeno-by/topic/reifyEugene Burmako2014-01-261-4/+4
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | corrects an error in reify’s documentation
| * | | | | | | corrects an error in reify’s documentationEugene Burmako2014-01-261-4/+4
| | |_|_|_|_|/ | |/| | | | |
* | | | | | | Merge pull request #3412 from retronym/ticket/2066-2.10-compatJason Zaugg2014-01-253-2/+5
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | -Xsource:2.10: lenient treatment of variance in <:<, =:=
| * | | | | | | SI-2066 -Xsource:2.10: lenient treatment of variance in <:<, =:=Jason Zaugg2014-01-243-2/+5
| |/ / / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The soundness hole was exploited in Scalaz. They have fixed their codebase correctly for Scalac 7.1.x, but have less freedom to break source compatiblity in 7.0.x. After this commit, they could choose to compile that branch with -Xsource:2.10
* / / / / / / Use more precise return types for objectsDenys Shabalin2014-01-242-4/+4
|/ / / / / / | | | | | | | | | | | | | | | | | | | | | | | | This ensures that q"object O" is of type ModuleDef rather than Tree and similarly q"package object O" is of type PackageDef.
* | | | | | Merge pull request #3401 from xeno-by/topic/freshEugene Burmako2014-01-224-12/+36
|\ \ \ \ \ \ | |/ / / / / |/| | | | | SI-6879 improves Context.freshName
| * | | | | addresses pull request feedbackEugene Burmako2014-01-222-4/+4
| | | | | |
| * | | | | SI-6879 improves Context.freshNameEugene Burmako2014-01-224-12/+36
| | |_|/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of per-compilation unit unique counters, the freshName API now uses a per-Global counter. Fresh names now also contain dollars to exclude clashes with supported user-defined names (the ones without dollar signs). This doesn’t fix the bug, because per-Global counters get created anew every time a new Global is instantiated, and that provides some potential for name clashes even for def macros, but at least it completely excludes clashes in typical situations.
* / | | | Expose seq field for variable arity definitionsDenys Shabalin2014-01-222-6/+14
|/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In 2.11 we've changed TupleClass, ProductClass and FunctionClass endpoints to be exposed as (Int => Symbol) functions that never throw exceptions but rather return NoSymbol instead of previous error-prone indexed access on array that could explode. While simplifying one use case (indexed access) it complicated ability to check if symbol at hand is in fact a tuple, product or function: (1 to 22).map(TupleClass).toList.contains(symbol) To cover this extra use case we add a seq method to the variable arity class definitions that exposes a corresponding sequence of class symbols: TupleClass.seq.contains(symbol)
* | | | Merge pull request #3392 from xeno-by/topic/untypecheckEugene Burmako2014-01-214-6/+27
|\ \ \ \ | | | | | | | | | | deprecates resetAllAttrs and resetLocalAttrs in favor of the new API
| * | | | deprecates resetAllAttrs and resetLocalAttrs in favor of the new APIEugene Burmako2014-01-211-6/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We now have c.untypecheck, which is supposed to be a counterpart of c.typecheck in the sense that it goes back from typed trees to untyped ones: http://stackoverflow.com/questions/20936509/scala-macros-what-is-the-difference-between-typed-aka-typechecked-an-untyped. Let’s hope that c.untypecheck will soon be able to solve our problems with partially/incorrectly attributed trees emitted by macros: https://groups.google.com/forum/#!topic/scala-internals/TtCTPlj_qcQ.
| * | | | moves analyzer.ImportType into scala.reflect.internalEugene Burmako2014-01-213-0/+7
| | |/ / | |/| | | | | | | | | | | | | | This cute little type is necessary for importers to work correctly. I wonder how we could overlook its existence for almost 2 years.
* | | | Merge pull request #3368 from retronym/ticket/8151Grzegorz Kossakowski2014-01-2112-47/+30
|\ \ \ \ | | | | | | | | | | SI-8151 Remove -Yself-in-annots and associated implementation
| * | | | SI-8151 Remove -Yself-in-annots and associated implementationJason Zaugg2014-01-1512-47/+30
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This experimental option typechecked arguments of annotations with an injected value in scope named `self`: @Foo(self.foo < 1) This has been slated for removal [1] for some time. This commit removes it in one fell swoop, without any attempt at source compatibility with code that constructs or pattern matches on AnnotatedType. [1] https://groups.google.com/d/msg/scala-internals/VdZ5UJwQFGI/C6tZ493Yxx4J
* | | | Merge pull request #3365 from retronym/ticket/8133Jason Zaugg2014-01-212-5/+10
|\ \ \ \ | | | | | | | | | | Fix regression with package objects, overloading
| * | | | SI-8133 Fix regression with package objects, overloadingJason Zaugg2014-01-142-5/+10
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Regressed in f5c336d56, a refactoring of `typedIdent`. In that commit, an (ostensibly) accidental change arrived, equivalent to: - val pre1 = if (qual == EmptyTree) NoPrefix else if (sym.isTopLevel) sym.owner.thisType else qual.tpe + val pre1 = if (sym.isTopLevel) sym.owner.thisType else if (qual == EmptyTree) NoPrefix else qual.tpe Here, `qual` is a tree returned in the successful result of `Context#lookup`. This change itself looks innocuous (top level symbols can be prefixed with a qualifier or not, right?), but it exposed us to a bug in `makeAccessible`. It is responsible for rewriting, e.g, `scala.List` to `scala.package.List`. It has a few cases, but one of them relies relies on typechecking `Ident(nme.PACKAGE)`, and hoping that it will bind to the right place. That's fraught with danger, and breaks in the enclosed tests. This commit binds that Ident symbolically, and in the process factors a tiny bit of code in common with `TreeGen`. (More work is still needed here!) In the next commit, I'm going to revert the change to `pre1`. That would have also fixed the regression, albeit symptomatically.
* | | | temporarily disables the toStringSubjects cacheEugene Burmako2014-01-201-7/+12
| | | |
* | | | addresses pull request feedbackEugene Burmako2014-01-201-1/+1
| | | |
* | | | capitalizes “s” in tostringEugene Burmako2014-01-203-19/+19
| | | | | | | | | | | | | | | | | | | | As suggested by the reviewers, tostringXXX variables in TypeToStrings.scala have been renamed to toStringXXX.
* | | | introduces failsafe against endless type printingEugene Burmako2014-01-203-1/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The parent commit works around a particular problem that led to a compiler freeze in SI-8158, whereas this commit introduces a general solution - a cache that tracks all types that we've recursed into during printing. I can't immediately come up with an example of a type that would be caught by this safety net, but unknown unknowns are the worst of them all, so why not guard against them while we can.
* | | | SI-8158 compiler hangs printing out fancy typesEugene Burmako2014-01-201-4/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apparently, even though the compiler has safeguards against infinite type printouts, having a depth counter, we didn’t account for the cases when printouts are both self-referential and self-multiplying. For one, SI-8158 provides an example of such a type, which is a structural type that refers to itself twice in return types of its methods. At first, printing such a type would go deeper and deeper, but then it will hit the depth limit and start multiply indefinitely. This commit fixes this particular problem by recognizing self-references as this.type’s and printing them out as such. The subsequent commit will introduce a more general facility.
* | | | fixes a typo in Types.scalaEugene Burmako2014-01-191-1/+1
| | | |
* | | | Merge pull request #3381 from retronym/topic/debug-friendlinessEugene Burmako2014-01-181-1/+1
|\ \ \ \ | | | | | | | | | | Fix compilation under -Ydebug
| * | | | Avoid cycles in Symbol toString under -YdebugJason Zaugg2014-01-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the first of two commits to restore workingness to the compiler under `-Ydebug`. `ResetAttrs` is now called during case class unapply synthesis, after the UnTyper was recently banished. But, this class has some low-level tracing that is triggered under `-Ydebug` (irrespective of any `-Ylog` settings.) This tracing code calls `Symbol#toString`, which, in an attempt to discriminate primary from secondary constructors, accesses the info of its owner. This is sufficient to hit a dreaded `CyclicReferenceError`. The enclosed test compiles a case class under this option to show that things now compile. It still spews out unwanted output; this will be removed in the next commit.
* | | | | Merge pull request #3377 from VladimirNik/sprinter-eol-fixAdriaan Moors2014-01-171-5/+7
|\ \ \ \ \ | | | | | | | | | | | | Fix EOL-printing in Printers test suite
| * | | | | Problem with EOL in tests for Printers is fixedVladimirNik2014-01-171-5/+7
| | |_|/ / | |/| | |
* | | | | Merge pull request #3378 from Blaisorblade/patch-1Adriaan Moors2014-01-171-1/+1
|\ \ \ \ \ | | | | | | | | | | | | Fix typo
| * | | | | Fix typoPaolo G. Giarrusso2014-01-171-1/+1
| |/ / / / | | | | | | | | | | In `for inner classes `val mm2 = im.reflectClass(<module symbol>)``, `<module symbol>` should read `<class symbol>`.
* | | | | Merge pull request #3373 from densh/topic/std-liftable-refinementAdriaan Moors2014-01-174-22/+29
|\ \ \ \ \ | |_|/ / / |/| | | | A few minor changes to standard liftable instances and liftable support
| * | | | Test edge cases of literal liftingDen Shabalin2014-01-161-10/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously in some corner situation proper Liftable instance might not have been resolved. In particular q"${true}" and q"${""}" used to fail.
| * | | | Give better names to UnliftHelper1 and UnliftHelper2Denys Shabalin2014-01-163-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | Previous ones were inscrutable but thankfully @xeno_by helped me out to find better alternatives.;
| * | | | Lift Some, None, Nil, Left, Right not just supertypesDenys Shabalin2014-01-161-4/+11
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously leaf concrete types were not lifted which could have caused weird problems when types is too precise: val s1 = Some(2) q"$s1" // used to fail
* / / / deprecates c.enclosingTree-style APIsEugene Burmako2014-01-163-5/+51
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Existing enclosing tree macro APIs face both technical and philosophical problems. On the one hand, it’s close to impossible to provide their robust implementation within the current typer infrastructure. From the very beginning, these APIs have been very experimental, and I was very much hoping to tackle the underlying technical problems, but after a year and a half I can say that it’s still outside our reach. On the other hand, we’re gravitating towards increasingly more local macro expansion, which is in direct contradiction with the existence of c.enclosingTree APIs. Therefore, in order to be able to further evolve macros, we need need additional freedom to reshape the enclosing tree APIs. Therefore I suggest we deprecate the aforementioned APIs and start preparing ourselves to removing them for good in 2.12.0. I hope that existing macros that use these APIs can be reformulated in terms of completely local expansion or be built on top of orthogonal language features (existing ones or new ones, e.g. something like https://groups.google.com/forum/#!topic/scala-debate/f4CLmYShX6Q). Please share your use cases, and I will be glad to help! We have at least the entire 2.12 development cycle ahead of us, so I’m sure we’ll figure this out. Let’s shape robust and scalable reflection API together!
* | | Merge pull request #3293 from soc/SI-7469Adriaan Moors2014-01-155-13/+9
|\ \ \ | | | | | | | | Remove misc. @deprecated elements
| * | | SI-7469 Remove misc. @deprecated elementsSimon Ochsenreither2014-01-095-13/+9
| | | |