| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
| |
Altered getOrElseUpdate to be robust to the map changing out from under it as a result of calling the default value method. Side-effects FTW!
Made a comparable change in LongMap also, as it was also affected. And added a test to SetMapConsistencyTest.
|
|\
| |
| | |
SI-8205 Don't include CR in line
|
|/
|
|
|
|
|
|
|
|
|
| |
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.
|
|\
| |
| | |
Avoid long, slow march to AIIOBE in SourceFile#lineContent
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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.
|
|\ \
| | |
| | | |
SI-8199 Account for module class suffix in -Xmax-classfile-name
|
| |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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.
|
|\ \
| | |
| | | |
SI-6844 SI-8076 improve handling of function parameters in quasiquotes
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
|\ \ \
| |_|/
|/| | |
SI-7275 allow flattening of blocks with ..$
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Previous version of the pattern wasn't precise enough due to the
fact that synthetic units are now erased by syntactic block and
this could cause incorrect reification for cases like:
val x = { val y = 1 }
Here syntactic block would extract one element but we still need to
reify it through syntactic block endpoint. So we can't filter based
on the number of elements extracted but rather filter on type of a
tree.
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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))
}
|
| | |
| | |
| | |
| | |
| | | |
New approach makes iterated function much more clear through aggressive
code reuse, recursion and large descriptive comment on top of it.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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.
|
|\ \ \
| | | |
| | | | |
SI-8182 Avert crash due to type args in pattern
|
| | | |
| | | |
| | | |
| | | |
| | | | |
Error out type args on binary op after emitting error.
Let the parse limp into the whirring blades.
|
|\ \ \ \
| |/ / /
|/| | | |
Fix misuse of underscores.
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
It's a language bug, but M[_] <: Foo[_] does not mean what
anyone who writes it believes that it means. You have to give
the type parameter a name, like M[X] <: Foo[X].
|
|\ \ \ \
| |/ / /
|/| | | |
corrects an error in reify’s documentation
|
| | | | |
|
|\ \ \ \
| | | | |
| | | | | |
Newline after empty string interp
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
Consume the newline non-raw for safe handling after
single-line interpolation.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
-Xsource:2.10: lenient treatment of variance in <:<, =:=
|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
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
|
|\ \ \ \ \ \
| |/ / / / /
|/| | | | | |
SI-8171 make tq"" an alias for empty type tree
|
| | | | | | |
|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
This ensures that q"object O" is of type ModuleDef rather than
Tree and similarly q"package object O" is of type PackageDef.
|
|\ \ \ \ \ \
| | | | | | |
| | | | | | | |
Versions of modules part of Scala 2.11.0-M8.
|
| | | | | | | |
|
|\ \ \ \ \ \ \
| |_|_|/ / / /
|/| | | | | | |
ListMap.tail is returning wrong result
|
| |/ / / / /
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
Reverted the commit that introduced the bug, and modified HashMap to no
longer assume that tail is O(1).
Review by @Ichoran, @soc
|
|\ \ \ \ \ \
| |_|/ / / /
|/| | | | | |
Preliminary support for building and testing with Java 8
|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
Replace the use of `Ordering` by custom, dummy trait Xyz defined in test's
source.
By not inheriting from Ordering in abstract-report2 we make the test
less dependent on both Scala and Java library. The reason we are less
dependent on Java is because Ordering extends Java's comparator.
This change is motivated by the fact that Java 8 introduced default
method `reversed` to Comparator interface and we get a failure due to
conflicting inheritance:
-abstract-report2.scala:9: error: trait Bippy inherits conflicting members:
- method reversed in trait TraversableOnce of type => List[(T2, String)] and
- method reversed in trait Comparator of type ()java.util.Comparator[T3]
-(Note: this can be resolved by declaring an override in trait Bippy.)
-trait Bippy[T1, T2, T3] extends Collection[T1] with TraversableOnce[(T2, String)] with Ordering[T3]
- ^
|
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
JDK7 and JDK8 have a bug that causes JVM to print some warning about
applets that is unrelated to whatever we are testing in Scala. Let's
work it around using test/files/filters mechanism that allows us to filter
out output lines based on regexp.
|
| |/ / / /
| | | | |
| | | | |
| | | | |
| | | | | |
We explicitly check for supported Java versions in our build.
Add Java 8 to the list of supported versions.
|
|\ \ \ \ \
| |_|/ / /
|/| | | | |
Add cross suffix customizability for modules
|
| | | | | |
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
For each module whose version can be specified using
the property "xxx.version.number", it is now possible
to specify its cross version suffix by using an
optional property "xxx.cross.suffix".
If such a property is not defined, then continue to
use the string "_${scala.binary.version}", as before.
|
|\ \ \ \ \
| |_|_|/ /
|/| | | | |
SI-6879 improves Context.freshName
|
| | | | | |
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
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.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
an optimization for c.eval
|
| |/ / / /
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
People are very frequently using c.eval in order to obtain underlying
values of literals. Spinning up a new compiler for that modest purpose
is a gross waste of fossil fuels.
|
|\ \ \ \ \
| |_|/ / /
|/| | | | |
Expose seq field for variable arity definitions
|
|/ / / /
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
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)
|
|\ \ \ \
| |/ / /
|/| | | |
Improve naming of ReadStdin
|
| | | |
| | | |
| | | |
| | | |
| | | | |
We don't need to say everything twice, methods are already prefixed
with “read”.
|