| Commit message (Collapse) | Author | Age | Files | Lines |
|\
| |
| | |
Port some ClassfileParser changes from scalac
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Adapted from scalac commit 3c5990ce5839f4bdfca8fed7f2c415a72f6a8bd8 by
Som Snytt:
Use DataInputStream.readUTF to read CONSTANT_Utf8_info.
This fixes reading embedded null char and supplementary chars.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Adapted from scalac commit 050b4c951c838699c2fe30cbf01b63942c63a299 by
Jason Zaugg:
Java synthesizes public constructors in private classes to
allow access from inner classes. The signature of
that synthetic constructor (known as a "access constructor")
has a dummy parameter appended to avoid overloading clashes.
javac chooses the type "Enclosing$1" for the dummy parameter
(called the "access constructor tag") which is either an
existing anonymous class or a synthesized class for this purpose.
In OpenJDK, this transformation is performed in:
langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java
(Incidentally, scalac would just emits a byte-code public
constructor in this situation, rather than a private constructor /
access constructor pair.)
Scala parses the signature of the access contructor, and drops
the $outer parameter, but retains the dummy parameter. This causes
havoc when it tries to parse the bytecode for that anonymous class;
the class file parser doesn't have the enclosing type parameters
of Vector in scope and crash ensues.
In any case, we shouldn't allow user code to see that constructor;
it should only be called from within its own compilation unit.
This commit drops the dummy parameter from access constructor
signatures in class file parsing.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Adapted from scalac commit 2a19cd56258884e25f26565d7b865cc2ec931b23 by
Jason Zaugg, but without the testing infrastructure added:
A classfile in the wild related to Vaadin lacked the InnerClasses
attribute. As such, our class file parser treated a nested enum
class as top-level, which led to a crash when trying to find its
linked module.
More details of the investigation are available in the JIRA comments.
The test introduces a new facility to rewrite classfiles.
This commit turns this situation into a logged warning, rather
than crashing. Code by paulp, test by yours truly.
|
|\ \
| |/
|/| |
Fix #2212: Avoid imports in the wrong namespace
|
| |
| |
| |
| |
| |
| | |
Don't issue an error if when considering a named import that
refers to a valoe or type which does not exist. Instead, disregard
the import an continue.
|
|\ \
| | |
| | | |
Fix #2218: Add fullyDefinedType for class parent types
|
| | |
| | |
| | |
| | |
| | |
| | | |
If we do not do that, any type variables in the parent type get interpolated
later, when the whole primary constructor is typed. But by then we miss the
context of what their variance was.
|
|\ \ \
| | | |
| | | | |
Fix #2186: Synchronize classpath handling with Scala 2.12
|
| | | |
| | | |
| | | |
| | | |
| | | | |
`dir.listFiles` will return null if called on a directory that no
longer exists, somehow partest triggers that.
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
This commit is a very crude port of the classpath handling as it exists
in the 2.12.x branch of scalac (hash: 232d95a198c94da0c6c8393624e83e9b9ac84e81),
this replaces the existing Classpath code that was adapted from scalac
years ago.
This code was written by Grzegorz Kossakowski, MichaĆ Pociecha, Lukas
Rytz, Jason Zaugg and other scalac contributors, many thanks to them!
For more information on this implementation, see the description of the
PR that originally added it to scalac: https://github.com/scala/scala/pull/4060
Changes made to the copied code to get it to compile with dotty:
- Rename scala.tools.nsc.util.ClassPath to dotty.tools.io.ClassPath
- Rename scala.tools.nsc.classpath.* to dotty.tools.dotc.classpath.*
- Replace "private[nsc]" by "private[dotty]"
- Changed `isClass` methods in FileUtils to skip Scala 2.11
implementation classes (needed until we stop being retro-compatible with
Scala 2.11)
I also copied PlainFile.scala from scalac to get access to
`PlainNioFile`.
|
|\ \ \ \
| |_|/ /
|/| | | |
fix #2163: don't narrow liftedOwner if symbol is InSuperCall
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
The previous fix was too coarse. We need to move an anonymous function
in a supercall towards the call, we just have to make sure it's not
in the directly enclosing class.
|
| |/ / |
|
|/ /
| |
| |
| |
| |
| |
| | |
Previously we just returned the unapplied WildcardType which is
incorrect if the WildcardType is bounded. The proper thing to do is to
do the type application on the bounds of the WildcardType and wrap the
result in a WildcardType.
|
| | |
|
|\ \
| | |
| | | |
Change case class desugaring and decouple Products and name-based-pattern-matching
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Product pattern use to:
- have a `<: Product` requirement
- compute the arity of a pattern by looking at `N` in a `ProductN` superclass.
This commit changes `<: Product`, instead we look for a `_1` member. The arity is determined by inspecting `_1` to `_N` members instead.
---
Here another attempt to formalize Dotty's pattern-matching (base on #1805). This covers the *Extractor Patterns* [section of the spec](https://www.scala-lang.org/files/archive/spec/2.12/08-pattern-matching.html#extractor-patterns). Dotty support 4 different extractor patterns: Boolean Pattern, Product Pattern, Seq Pattern and Name Based Pattern.
Boolean Pattern
- Extractor defines `def unapply(x: T): Boolean`
- Pattern-matching on exactly `0` patterns
Product Pattern
- Extractor defines `def unapply(x: T): U`
- `N > 0` is the maximum number of consecutive (parameterless `def` or `val`) `_1: P1` ... `_N: PN` members in `U`
- Pattern-matching on exactly `N` patterns with types `P1, P2, ..., PN`
Seq Pattern
- Extractor defines `def unapplySeq(x: T): U`
- `U` has (parameterless `def` or `val`) members `isEmpty: Boolean` and `get: S`
- `S <: Seq[V]`
- Pattern-matching on any number of pattern with types `V, V, ..., V`
Name Based Pattern
- Extractor defines `def unapply(x: T): U`
- `U` has (parameterless `def` or `val`) members `isEmpty: Boolean` and `get: S`
- If there is exactly `1` pattern, pattern-matching on `1` pattern with type `S`
- Otherwise fallback to Product Pattern on type `U`
In case of ambiguities, *Product Pattern* is preferred over *Name Based Pattern*.
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | | |
Used a hardcoded string before, which caused test failures.
|
| | |
| | |
| | |
| | |
| | | |
Running the test suite with the pickling printer on showed up two more
problems which are fixed in this commit.
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Names with internal $'s are entered in package scopes only if
- we look for a name with internal $'s.
- we want to know all the members of a package scope
This optimization seems to be fairly effective. The typical range
of package scopes that need $-names is between 0 and 20%. The optimization
seems to improve execution time of all unit tests by about 3%.
Also. drop the inheritance from Iterable to Scope. The reason
is that we now need a context parameter for toList and
other Iterable operations which makes them impossible to
fit into the Iterable framework.
|
| | |
| | |
| | |
| | |
| | |
| | | |
Since we now have separate package-scopes, it's easier to have
them take into account the special role played by the scala package.
So we can drop the funky logic of `makeScalaSpecial`.
|
| | |
| | |
| | |
| | | |
and fix a bug in TreeUnpickler
|
| | |
| | |
| | |
| | | |
Prevviously they were actually unused.
|
| | |
| | |
| | |
| | | |
Mangled is like toSimpleName, except that it keeps the term/type distinction.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Once we start using unencoded operators internally, we will face the problem
that one cannot decode realiably a class file filename. We therefore turn
things around, keeping members of package scopes in mangled and encoded form.
This is compensated by (1) mangling names for lookup of such members and
(2) when unpickling from Scala 2 info or Tasty, comparing mangled names when
matching a read class or module object against a root.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Simplifies the test that the class represented by a classfile
is the class logically referenced by the file. The simplification
is needed if we want to populate package scopes with unmangled
classnames.
|
| | |
| | |
| | |
| | |
| | | |
Classfile parsing is about JVM-level names, not Scala level ones. So it
is more consistent to use mangled names throughout.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
toSimpleName is called a lot from the backend, so it makes
sense to memoize it. It would be even better to communicate
with the backend using strings, because then we would not
have to enter all these simple names in the name table.
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Drop Seq implementation of name. This implementation
was always problematic because it entailed potentially
very costly conversions to toSimpleName. We now have
better control over when we convert a name to a simple
name.
|
| | |
| | |
| | |
| | | |
Remove unused functionality
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | | |
1. Fix problem in fullNameSeparated
2. Revise expandedName operations
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The backend contains:
val outerName = innerClassSym.rawowner.javaBinaryName
// Java compatibility. See the big comment in BTypes that summarizes the InnerClass spec.
val outerNameModule = if (innerClassSym.rawowner.isTopLevelModuleClass) outerName.dropModule
Where `dropModule` is defined in the backend interface as:
def dropModule: Name = n.stripModuleClassSuffix
This will only work as expected if `javaBinaryName` returns a name with
proper semantic information, but before this commit we just used the
output of `fullNameSeparated` which contains no semantic information.
|
| | | |
|