Index: pkg/fletchc/lib/src/fletch_backend.dart |
diff --git a/pkg/fletchc/lib/src/fletch_backend.dart b/pkg/fletchc/lib/src/fletch_backend.dart |
index 2d40f40347eb99a7a1d49000bb9057b65838fdd0..60b5163eb3ebf8f50187ff2ec62efa1a75452b94 100644 |
--- a/pkg/fletchc/lib/src/fletch_backend.dart |
+++ b/pkg/fletchc/lib/src/fletch_backend.dart |
@@ -10,18 +10,22 @@ import 'dart:async' show |
import 'dart:collection' show |
Queue; |
-import 'package:compiler/src/dart2jslib.dart' show |
+import 'package:compiler/src/common/backend_api.dart' show |
Backend, |
- BackendConstantEnvironment, |
- Compiler, |
- CompilerTask, |
- ConstantCompilerTask, |
+ ImpactTransformer; |
+ |
+import 'package:compiler/src/common/tasks.dart' show |
+ CompilerTask; |
+ |
+import 'package:compiler/src/enqueue.dart' show |
Enqueuer, |
- MessageKind, |
- Registry, |
- ResolutionCallbacks, |
- ResolutionEnqueuer, |
- isPrivateName; |
+ ResolutionEnqueuer; |
+ |
+import 'package:compiler/src/diagnostics/messages.dart' show |
+ MessageKind; |
+ |
+import 'package:compiler/src/common/registry.dart' show |
+ Registry; |
import 'package:compiler/src/dart_types.dart' show |
DartType, |
@@ -47,14 +51,22 @@ import 'package:compiler/src/elements/elements.dart' show |
LibraryElement, |
MemberElement, |
Name, |
- ParameterElement; |
+ ParameterElement, |
+ PublicName; |
-import 'package:compiler/src/universe/universe.dart' show |
- CallStructure, |
- Selector, |
- UniverseSelector; |
+import 'package:compiler/src/universe/selector.dart' show |
+ Selector; |
-import 'package:compiler/src/util/util.dart' show |
+import 'package:compiler/src/universe/use.dart' show |
+ DynamicUse, |
+ StaticUse, |
+ TypeUse, |
+ TypeUseKind; |
+ |
+import 'package:compiler/src/universe/call_structure.dart' show |
+ CallStructure; |
+ |
+import 'package:compiler/src/common.dart' show |
Spannable; |
import 'package:compiler/src/elements/modelx.dart' show |
@@ -80,7 +92,7 @@ import 'package:compiler/src/constants/values.dart' show |
import 'package:compiler/src/constants/expressions.dart' show |
ConstantExpression; |
-import 'package:compiler/src/resolution/resolution.dart' show |
+import 'package:compiler/src/resolution/tree_elements.dart' show |
TreeElements; |
import 'package:compiler/src/library_loader.dart' show |
@@ -90,9 +102,7 @@ import 'package:persistent/persistent.dart' show |
PersistentMap; |
import 'fletch_function_builder.dart' show |
- FletchFunctionKind, |
- FletchFunctionBuilder, |
- DebugInfo; |
+ FletchFunctionBuilder; |
import 'fletch_class_builder.dart' show |
FletchClassBuilder; |
@@ -114,6 +124,15 @@ import 'fletch_registry.dart' show |
import 'diagnostic.dart' show |
throwInternalError; |
+import 'package:compiler/src/common/names.dart' show |
+ Identifiers, |
+ Names; |
+ |
+import 'package:compiler/src/universe/world_impact.dart' show |
+ TransformedWorldImpact, |
+ WorldImpact, |
+ WorldImpactBuilder; |
+ |
import 'class_debug_info.dart'; |
import 'codegen_visitor.dart'; |
import 'debug_info.dart'; |
@@ -130,6 +149,7 @@ import 'closure_environment.dart'; |
import '../bytecodes.dart'; |
import '../commands.dart'; |
import '../fletch_system.dart'; |
+import 'package:compiler/src/common/resolution.dart'; |
const FletchSystem BASE_FLETCH_SYSTEM = const FletchSystem( |
const PersistentMap<int, FletchFunction>(), |
@@ -143,7 +163,7 @@ const FletchSystem BASE_FLETCH_SYSTEM = const FletchSystem( |
const PersistentMap<int, int>(), |
const PersistentMap<int, int>()); |
-class FletchBackend extends Backend with ResolutionCallbacks |
+class FletchBackend extends Backend |
implements IncrementalFletchBackend { |
static const String growableListName = '_GrowableList'; |
static const String constantListName = '_ConstantList'; |
@@ -224,11 +244,15 @@ class FletchBackend extends Backend with ResolutionCallbacks |
final Set<FunctionElement> alwaysEnqueue = new Set<FunctionElement>(); |
+ FletchImpactTransformer impactTransformer; |
+ |
FletchBackend(FletchCompilerImplementation compiler) |
: this.context = compiler.context, |
this.constantCompilerTask = new DartConstantTask(compiler), |
this.systemBuilder = new FletchSystemBuilder(BASE_FLETCH_SYSTEM), |
- super(compiler); |
+ super(compiler) { |
+ this.impactTransformer = new FletchImpactTransformer(this); |
+ } |
void newSystemBuilder(FletchSystem predecessorSystem) { |
systemBuilder = new FletchSystemBuilder(predecessorSystem); |
@@ -255,8 +279,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// This is a workaround, where we basically add getters for all fields. |
classBuilder.updateImplicitAccessors(this); |
- Element callMember = element.lookupLocalMember( |
- Compiler.CALL_OPERATOR_NAME); |
+ Element callMember = element.lookupLocalMember(Identifiers.call); |
if (callMember != null && callMember.isFunction) { |
FunctionElement function = callMember; |
classBuilder.createIsFunctionEntry( |
@@ -273,8 +296,6 @@ class FletchBackend extends Backend with ResolutionCallbacks |
return classBuilder; |
} |
- ResolutionCallbacks get resolutionCallbacks => this; |
- |
List<CompilerTask> get tasks => <CompilerTask>[]; |
ConstantSystem get constantSystem { |
@@ -287,8 +308,8 @@ class FletchBackend extends Backend with ResolutionCallbacks |
bool methodNeedsRti(FunctionElement function) => false; |
- void enqueueHelpers(ResolutionEnqueuer world, incomingRegistry) { |
- FletchRegistry registry = incomingRegistry; |
+ void enqueueHelpers(ResolutionEnqueuer world, Registry incomingRegistry) { |
+ FletchRegistry registry = new FletchRegistry(compiler); |
compiler.patchAnnotationClass = patchAnnotationClass; |
bool hasMissingHelpers = false; |
@@ -302,7 +323,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
} |
if (helper == null) { |
hasMissingHelpers = true; |
- compiler.reportError( |
+ compiler.reporter.reportErrorMessage( |
library, MessageKind.GENERIC, |
{'text': "Required implementation method '$name' not found."}); |
} |
@@ -312,9 +333,12 @@ class FletchBackend extends Backend with ResolutionCallbacks |
throwInternalError( |
"Some implementation methods are missing, see details above"); |
} |
- world.registerStaticUse(fletchCompileError); |
- world.registerStaticUse(fletchSystemEntry); |
- world.registerStaticUse(fletchUnresolved); |
+ world.registerStaticUse( |
+ new StaticUse.staticInvoke(fletchCompileError, CallStructure.NO_ARGS)); |
+ world.registerStaticUse( |
+ new StaticUse.staticInvoke(fletchSystemEntry, CallStructure.ONE_ARG)); |
+ world.registerStaticUse( |
+ new StaticUse.staticInvoke(fletchUnresolved, CallStructure.ONE_ARG)); |
loadHelperClasses(( |
String name, |
@@ -323,7 +347,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
var classImpl = library.findLocal(name); |
if (classImpl == null) classImpl = library.implementation.find(name); |
if (classImpl == null) { |
- compiler.reportError( |
+ compiler.reporter.reportErrorMessage( |
library, MessageKind.GENERIC, |
{'text': "Required implementation class '$name' not found."}); |
hasMissingHelpers = true; |
@@ -334,8 +358,8 @@ class FletchBackend extends Backend with ResolutionCallbacks |
{ |
// TODO(ahe): Register in ResolutionCallbacks. The lines in this block |
// should not happen at this point in time. |
- classImpl.ensureResolved(compiler); |
- world.registerInstantiatedType(classImpl.rawType, registry.asRegistry); |
+ classImpl.ensureResolved(compiler.resolution); |
+ world.registerInstantiatedType(classImpl.rawType); |
// TODO(ahe): This is a hack to let both the world and the codegen know |
// about the instantiated type. |
registry.registerInstantiatedType(classImpl.rawType); |
@@ -349,21 +373,25 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// Register list constructors to world. |
// TODO(ahe): Register growableListClass through ResolutionCallbacks. |
- growableListClass.constructors.forEach(world.registerStaticUse); |
+ growableListClass.constructors.forEach((Element element) { |
+ world.registerStaticUse(new StaticUse.constructorInvoke(element, null)); |
+ }); |
// TODO(ajohnsen): Remove? String interpolation does not enqueue '+'. |
// Investigate what else it may enqueue, could be StringBuilder, and then |
// consider using that instead. |
- var selector = new UniverseSelector(new Selector.binaryOperator('+'), null); |
- world.registerDynamicInvocation(selector); |
+ world.registerDynamicUse( |
+ new DynamicUse(new Selector.binaryOperator('+'), null)); |
- selector = new UniverseSelector(new Selector.call('add', null, 1), null); |
- world.registerDynamicInvocation(selector); |
+ world.registerDynamicUse(new DynamicUse( |
+ new Selector.call(new PublicName('add'), CallStructure.ONE_ARG), null)); |
- alwaysEnqueue.add(compiler.objectClass.implementation.lookupLocalMember( |
- noSuchMethodTrampolineName)); |
- alwaysEnqueue.add(compiler.objectClass.implementation.lookupLocalMember( |
- noSuchMethodName)); |
+ alwaysEnqueue.add( |
+ compiler.coreClasses.objectClass.implementation.lookupLocalMember( |
+ noSuchMethodTrampolineName)); |
+ alwaysEnqueue.add( |
+ compiler.coreClasses.objectClass.implementation.lookupLocalMember( |
+ noSuchMethodName)); |
if (coroutineClass != null) { |
builtinClasses.add(coroutineClass); |
@@ -371,7 +399,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
} |
for (FunctionElement element in alwaysEnqueue) { |
- world.registerStaticUse(element); |
+ world.registerStaticUse(new StaticUse.foreignUse(element)); |
} |
} |
@@ -431,24 +459,21 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// This class is optional. |
coroutineClass = fletchSystemLibrary.implementation.find("Coroutine"); |
if (coroutineClass != null) { |
- coroutineClass.ensureResolved(compiler); |
+ coroutineClass.ensureResolved(compiler.resolution); |
} |
} |
void onElementResolved(Element element, TreeElements elements) { |
if (alwaysEnqueue.contains(element)) { |
- var registry = new FletchRegistry(compiler, elements); |
- registry.registerStaticInvocation(element); |
+ var registry = new FletchRegistry(compiler); |
+ if (element.isStatic || element.isTopLevel) { |
+ registry.registerStaticUse(new StaticUse.foreignUse(element)); |
+ } else { |
+ registry.registerDynamicUse(new Selector.fromElement(element)); |
ahe
2015/12/01 10:12:12
This isn't a dynamic use, and it is a problem for
sigurdm
2015/12/03 14:48:09
Done.
|
+ } |
} |
} |
- void onMapLiteral(Registry registry, DartType type, bool isConstant) { |
- if (isConstant) return; |
- ClassElement classImpl = mapImplementation; |
- registry.registerInstantiation(classImpl.rawType); |
- registry.registerStaticInvocation(classImpl.lookupDefaultConstructor()); |
- } |
- |
ClassElement get intImplementation => smiClass; |
/// Class of annotations to mark patches in patch files. |
@@ -458,8 +483,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
/// compile-time constant instance of [patchAnnotationClass]. |
ClassElement get patchAnnotationClass { |
// TODO(ahe): Introduce a proper constant class to identify constants. For |
- // now, we simply put "const patch = "patch";" in the beginning of patch |
- // files. |
+ // now, we simply put "const patch = "patch";" in fletch._system. |
return super.stringImplementation; |
} |
@@ -696,7 +720,6 @@ class FletchBackend extends Backend with ResolutionCallbacks |
builder, |
context, |
elements, |
- null, |
closureEnvironment, |
element, |
compiler); |
@@ -710,7 +733,6 @@ class FletchBackend extends Backend with ResolutionCallbacks |
builder, |
context, |
elements, |
- null, |
closureEnvironment, |
element, |
classBuilder, |
@@ -721,21 +743,20 @@ class FletchBackend extends Backend with ResolutionCallbacks |
builder, |
context, |
elements, |
- null, |
closureEnvironment, |
element, |
compiler); |
} |
if (isNative(element)) { |
- compiler.withCurrentElement(element, () { |
+ compiler.reporter.withCurrentElement(element, () { |
codegenNativeFunction(element, codegen); |
}); |
} else if (isExternal(element)) { |
- compiler.withCurrentElement(element, () { |
+ compiler.reporter.withCurrentElement(element, () { |
codegenExternalFunction(element, codegen); |
}); |
} else { |
- compiler.withCurrentElement(element, () { codegen.compile(); }); |
+ compiler.reporter.withCurrentElement(element, () { codegen.compile(); }); |
} |
// The debug codegen should generate the same bytecodes as the original |
// codegen. If that is not the case debug information will be useless. |
@@ -757,13 +778,14 @@ class FletchBackend extends Backend with ResolutionCallbacks |
TreeElements treeElements, |
FletchRegistry registry) { |
AstElement element = declaration.implementation; |
- compiler.withCurrentElement(element, () { |
+ compiler.reporter.withCurrentElement(element, () { |
assert(declaration.isDeclaration); |
context.compiler.reportVerboseInfo(element, 'Compiling $element'); |
if (element.isFunction || |
element.isGetter || |
element.isSetter || |
- element.isGenerativeConstructor) { |
+ element.isGenerativeConstructor || |
+ element.isFactoryConstructor) { |
// For a generative constructor, this means compile the constructor |
// body. See [compilePendingConstructorInitializers] for an overview of |
// how constructor initializers and constructor bodies are compiled. |
@@ -772,7 +794,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
context.compiler.reportVerboseInfo( |
element, "Asked to compile a field, but don't know how"); |
} else { |
- compiler.internalError( |
+ compiler.reporter.internalError( |
element, "Uninimplemented element kind: ${element.kind}"); |
} |
}); |
@@ -788,7 +810,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
TreeElements treeElements, |
FletchRegistry registry) { |
AstElement element = declaration.implementation; |
- compiler.withCurrentElement(element, () { |
+ compiler.reporter.withCurrentElement(element, () { |
assert(declaration.isDeclaration); |
context.compiler.reportVerboseInfo(element, 'Compiling $element'); |
if (!element.isInstanceMember && !isLocalFunction(element)) { |
@@ -835,7 +857,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FletchRegistry registry, |
ClosureKind kind) { |
AstElement element = declaration.implementation; |
- compiler.withCurrentElement(element, () { |
+ compiler.reporter.withCurrentElement(element, () { |
assert(declaration.isDeclaration); |
if (shouldReportEnqueuingOfElement(compiler, element)) { |
context.compiler.reportVerboseInfo( |
@@ -844,7 +866,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FletchFunctionBase function = |
systemBuilder.lookupFunctionByElement(element.declaration); |
if (function == null) { |
- compiler.internalError( |
+ compiler.reporter.internalError( |
element, "Has no fletch function, but used as tear-off"); |
} |
if (selector.isGetter) { |
@@ -853,16 +875,16 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// TODO(ahe): This code should probably use [kind] to detect the |
// various cases instead of [isLocalFunction] and looking at names. |
- assert(selector.memberName == Selector.CALL_NAME); |
+ assert(selector.memberName == Names.CALL_NAME); |
if (isLocalFunction(element) || |
- memberName(element) == Selector.CALL_NAME) { |
+ memberName(element) == Names.CALL_NAME) { |
createTearoffGetterForFunction( |
function, isSpecialCallMethod: true); |
return; |
} |
int stub = systemBuilder.lookupTearOffById(function.functionId); |
if (stub == null) { |
- compiler.internalError( |
+ compiler.reporter.internalError( |
element, "No tear-off stub to compile `call` tear-off"); |
} else { |
function = systemBuilder.lookupFunction(stub); |
@@ -873,7 +895,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
switch (kind) { |
case ClosureKind.tearOff: |
case ClosureKind.superTearOff: |
- if (memberName(element) == Selector.CALL_NAME) { |
+ if (memberName(element) == Names.CALL_NAME) { |
// This is really a functionLikeTearOff. |
break; |
} |
@@ -881,7 +903,8 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// that stub: |
int stub = systemBuilder.lookupTearOffById(function.functionId); |
if (stub == null) { |
- compiler.internalError(element, "Couldn't find tear-off stub"); |
+ compiler.reporter |
+ .internalError(element, "Couldn't find tear-off stub"); |
} else { |
function = systemBuilder.lookupFunction(stub); |
} |
@@ -894,7 +917,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
case ClosureKind.functionLike: |
case ClosureKind.functionLikeTearOff: |
- compiler.internalError(element, "Unimplemented: $kind"); |
+ compiler.reporter.internalError(element, "Unimplemented: $kind"); |
break; |
} |
@@ -908,7 +931,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FunctionElement function, |
TreeElements elements, |
FletchRegistry registry) { |
- registry.registerStaticInvocation(fletchSystemEntry); |
+ registry.registerStaticUse(new StaticUse.foreignUse(fletchSystemEntry)); |
ahe
2015/12/01 10:12:12
Should not create an instance of StaticUse.
sigurdm
2015/12/03 14:48:09
Done.
|
ClosureEnvironment closureEnvironment = createClosureEnvironment( |
function, |
@@ -919,7 +942,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
if (function.memberContext != function) { |
functionBuilder = internalCreateFletchFunctionBuilder( |
function, |
- Compiler.CALL_OPERATOR_NAME, |
+ Identifiers.call, |
createClosureClass(function, closureEnvironment)); |
} else { |
functionBuilder = createFletchFunctionBuilder(function); |
@@ -1002,24 +1025,21 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// The static native method `Coroutine._coroutineNewStack` will invoke |
// the instance method `Coroutine._coroutineStart`. |
if (coroutineClass == null) { |
- compiler.internalError( |
+ compiler.reporter.internalError( |
function, "required class [Coroutine] not found"); |
} |
FunctionElement coroutineStart = |
coroutineClass.lookupLocalMember("_coroutineStart"); |
Selector selector = new Selector.fromElement(coroutineStart); |
- new FletchRegistry(compiler, function.resolvedAst.elements) |
- ..registerDynamicInvocation(new UniverseSelector(selector, null)); |
+ new FletchRegistry(compiler) |
+ ..registerDynamicUse(selector); |
} else if (name == "Process._spawn") { |
// The native method `Process._spawn` will do a closure invoke with 0, 1, |
// or 2 arguments. |
- new FletchRegistry(compiler, function.resolvedAst.elements) |
- ..registerDynamicInvocation( |
- new UniverseSelector(new Selector.callClosure(0), null)) |
- ..registerDynamicInvocation( |
- new UniverseSelector(new Selector.callClosure(1), null)) |
- ..registerDynamicInvocation( |
- new UniverseSelector(new Selector.callClosure(2), null)); |
+ new FletchRegistry(compiler) |
+ ..registerDynamicUse(new Selector.callClosure(0)) |
ahe
2015/12/01 10:12:12
It's somewhat confusing that FletchRegistry uses t
sigurdm
2015/12/03 14:48:09
I renamed it to registerDynamicSelector
|
+ ..registerDynamicUse(new Selector.callClosure(1)) |
+ ..registerDynamicUse(new Selector.callClosure(2)); |
} |
int arity = codegen.assembler.functionArity; |
@@ -1055,7 +1075,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
function.library == compiler.coreLibrary) { |
codegenExternalNoSuchMethodTrampoline(function, codegen); |
} else { |
- compiler.reportError( |
+ compiler.reporter.reportErrorMessage( |
function.node, |
MessageKind.GENERIC, |
{'text': 'External function is not supported'}); |
@@ -1090,7 +1110,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
void codegenExternalInvokeMain( |
FunctionElement function, |
FunctionCodegen codegen) { |
- compiler.internalError( |
+ compiler.reporter.internalError( |
function, "[codegenExternalInvokeMain] not implemented."); |
// TODO(ahe): This code shouldn't normally be called, only if invokeMain is |
// torn off. Perhaps we should just say we don't support that. |
@@ -1103,7 +1123,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// kept in sync with: |
// src/vm/interpreter.cc:HandleEnterNoSuchMethod |
int id = context.getSymbolId( |
- context.mangleName(noSuchMethodName, compiler.coreLibrary)); |
+ context.mangleName(new Name(noSuchMethodName, compiler.coreLibrary))); |
int fletchSelector = FletchSelector.encodeMethod(id, 3); |
BytecodeLabel skipGetter = new BytecodeLabel(); |
codegen.assembler |
@@ -1159,9 +1179,8 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FunctionElement function = value.element; |
createTearoffClass(createFletchFunctionBuilder(function)); |
// Be sure to actually enqueue the function for compilation. |
- FletchRegistry registry = |
- new FletchRegistry(compiler, function.resolvedAst.elements); |
- registry.registerStaticInvocation(function); |
+ FletchRegistry registry = new FletchRegistry(compiler); |
+ registry.registerStaticUse(new StaticUse.foreignUse(function)); |
ahe
2015/12/01 10:12:12
Shouldn't instantiate StaticUse.
sigurdm
2015/12/03 14:48:09
Done.
|
} |
FletchFunctionBase createParameterStubFor( |
@@ -1289,8 +1308,10 @@ class FletchBackend extends Backend with ResolutionCallbacks |
if (function.element != null) { |
library = function.element.library; |
} |
+ // TODO(sigurdm): Avoid allocating new name here. |
+ Name name = new Name(function.name, library); |
int fletchSelector = context.toFletchSelector( |
- new Selector.getter(function.name, library)); |
+ new Selector.getter(name)); |
ahe
2015/12/01 10:12:12
Also, we shouldn't allocate a selector.
sigurdm
2015/12/03 14:48:09
Added to TODO
|
FletchClassBuilder classBuilder = systemBuilder.lookupClassBuilder( |
function.memberOf); |
classBuilder.addToMethodTable(fletchSelector, getter); |
@@ -1343,7 +1364,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
} |
bool registerDeferredLoading(Spannable node, Registry registry) { |
- compiler.reportWarning( |
+ compiler.reporter.reportWarningMessage( |
node, |
MessageKind.GENERIC, |
{'text': "Deferred loading is not supported."}); |
@@ -1391,13 +1412,13 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FunctionElement resolveExternalFunction(FunctionElement element) { |
if (element.isPatched) { |
FunctionElementX patch = element.patch; |
- compiler.withCurrentElement(patch, () { |
- patch.parseNode(compiler); |
- patch.computeType(compiler); |
+ compiler.reporter.withCurrentElement(patch, () { |
+ patch.parseNode(compiler.parsing); |
+ patch.computeType(compiler.resolution); |
}); |
element = patch; |
// TODO(ahe): Don't use ensureResolved (fix TODO in isNative instead). |
- element.metadata.forEach((m) => m.ensureResolved(compiler)); |
+ element.metadata.forEach((m) => m.ensureResolved(compiler.resolution)); |
} else if (element.library == fletchSystemLibrary) { |
// Nothing needed for now. |
} else if (element.library == compiler.coreLibrary) { |
@@ -1411,7 +1432,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
} else if (externals.contains(element)) { |
// Nothing needed for now. |
} else { |
- compiler.reportError( |
+ compiler.reporter.reportErrorMessage( |
element, MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
} |
return element; |
@@ -1459,7 +1480,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
void compileConstructorInitializer(FletchFunctionBuilder functionBuilder) { |
ConstructorElement constructor = functionBuilder.element; |
assert(constructor.isImplementation); |
- compiler.withCurrentElement(constructor, () { |
+ compiler.reporter.withCurrentElement(constructor, () { |
assert(functionBuilder == |
systemBuilder.lookupConstructorInitializerByElement(constructor)); |
context.compiler.reportVerboseInfo( |
@@ -1470,8 +1491,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
// TODO(ahe): We shouldn't create a registry, but we have to as long as |
// the enqueuer doesn't support elements with more than one compilation |
// artifact. |
- FletchRegistry registry = |
- new FletchRegistry(compiler, elements); |
+ FletchRegistry registry = new FletchRegistry(compiler); |
FletchClassBuilder classBuilder = |
registerClassElement(constructor.enclosingClass.declaration); |
@@ -1517,7 +1537,7 @@ class FletchBackend extends Backend with ResolutionCallbacks |
FletchFunctionBuilder function, |
{bool suppressHint: false}) { |
if (!suppressHint) { |
- compiler.reportHint( |
+ compiler.reporter.reportHintMessage( |
spannable, MessageKind.GENERIC, {'text': reason}); |
} |
var constString = constantSystem.createString( |
@@ -1614,10 +1634,10 @@ class FletchBackend extends Backend with ResolutionCallbacks |
} |
bool onQueueEmpty(Enqueuer enqueuer, Iterable<ClassElement> recentClasses) { |
- if (!enqueuer.isResolutionQueue) { |
+ if (enqueuer is! ResolutionEnqueuer) { |
compilePendingConstructorInitializers(); |
} |
- return super.onQueueEmpty(enqueuer, recentClasses); |
+ return true; |
} |
FletchEnqueueTask makeEnqueuer() => new FletchEnqueueTask(compiler); |
@@ -1656,6 +1676,51 @@ class FletchBackend extends Backend with ResolutionCallbacks |
static FletchBackend newInstance(FletchCompilerImplementation compiler) { |
return new FletchBackend(compiler); |
} |
+ |
+ Uri resolvePatchUri(String libraryName, Uri libraryRoot) { |
+ throw "Not implemented"; |
+ } |
+ |
ahe
2015/12/01 10:12:12
Extra line.
sigurdm
2015/12/03 14:48:09
Done.
|
+} |
+ |
+class FletchImpactTransformer extends ImpactTransformer { |
+ final FletchBackend backend; |
+ |
+ FletchImpactTransformer(this.backend); |
+ |
+ @override |
+ WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) { |
+ TransformedWorldImpact transformed = |
+ new TransformedWorldImpact(worldImpact); |
+ |
+ bool anyChange = false; |
+ |
+ if (worldImpact.constSymbolNames.isNotEmpty) { |
+ ClassElement symbolClass = |
+ backend.compiler.coreClasses.symbolClass.declaration; |
+ transformed.registerTypeUse( |
+ new TypeUse.instantiation(symbolClass.rawType)); |
+ transformed.registerStaticUse( |
+ new StaticUse.foreignUse( |
+ symbolClass.lookupConstructor(""))); |
+ anyChange = true; |
+ } |
+ |
+ for (MapLiteralUse mapLiteralUse in worldImpact.mapLiterals) { |
+ if (mapLiteralUse.isConstant) continue; |
+ transformed.registerTypeUse( |
+ new TypeUse.instantiation(backend.mapImplementation.rawType)); |
+ transformed.registerStaticUse( |
+ new StaticUse.constructorInvoke( |
+ backend.mapImplementation.lookupConstructor(""), |
+ CallStructure.NO_ARGS)); |
+ anyChange = true; |
+ } |
+ return anyChange ? transformed : worldImpact; |
+ } |
+ |
+ @override |
+ transformCodegenImpact(impact) => throw "unimplemented"; |
} |
bool isLocalFunction(Element element) { |