Store token in ImplicitType

Change-Id: I35c9a5b79b41a8c9df1afee6195b2c3ebdc22838
Reviewed-on: https://dart-review.googlesource.com/c/86356
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
Peter von der Ahé 2018-12-19 17:21:51 +00:00 committed by commit-bot@chromium.org
parent a6e37888ee
commit bf5ae2215b
9 changed files with 79 additions and 34 deletions

View file

@ -0,0 +1,33 @@
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library fasta.implicit_type;
import 'package:kernel/ast.dart'
show DartType, DartTypeVisitor, DartTypeVisitor1, Visitor;
import '../../scanner/token.dart' show Token;
import '../problems.dart' show unsupported;
import 'kernel_builder.dart' show MemberBuilder;
class ImplicitType extends DartType {
final MemberBuilder member;
final Token initializerToken;
const ImplicitType(this.member, this.initializerToken);
accept(DartTypeVisitor<Object> v) {
unsupported("accept", member.charOffset, member.fileUri);
}
accept1(DartTypeVisitor1<Object, Object> v, arg) {
unsupported("accept1", member.charOffset, member.fileUri);
}
visitChildren(Visitor<Object> v) {
unsupported("visitChildren", member.charOffset, member.fileUri);
}
}

View file

@ -16,6 +16,8 @@ import '../combinator.dart' as fasta;
export '../builder/builder.dart';
export 'implicit_type.dart' show ImplicitType;
export 'kernel_class_builder.dart' show KernelClassBuilder;
export 'kernel_enum_builder.dart' show KernelEnumBuilder;

View file

@ -133,9 +133,9 @@ class KernelEnumBuilder extends SourceClassBuilder
/// }
members["index"] = new KernelFieldBuilder(null, intType, "index",
finalMask | hasInitializerMask, parent, charOffset, null);
finalMask | hasInitializerMask, parent, charOffset);
members["_name"] = new KernelFieldBuilder(null, stringType, "_name",
finalMask | hasInitializerMask, parent, charOffset, null);
finalMask | hasInitializerMask, parent, charOffset);
KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder(
null,
constMask,
@ -160,8 +160,7 @@ class KernelEnumBuilder extends SourceClassBuilder
"values",
constMask | staticMask | hasInitializerMask,
parent,
charOffset,
null);
charOffset);
members["values"] = valuesBuilder;
KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(
null,
@ -219,8 +218,7 @@ class KernelEnumBuilder extends SourceClassBuilder
name,
constMask | staticMask | hasInitializerMask,
parent,
enumConstantInfo.charOffset,
null);
enumConstantInfo.charOffset);
metadataCollector?.setDocumentationComment(
fieldBuilder.target, documentationComment);
members[name] = fieldBuilder..next = existing;

View file

@ -5,22 +5,21 @@
library fasta.kernel_field_builder;
import 'package:kernel/ast.dart'
show DartType, Expression, Field, Name, NullLiteral;
show DartType, DynamicType, Expression, Field, Name, NullLiteral;
import '../../base/instrumentation.dart'
show Instrumentation, InstrumentationValueForType;
import '../../scanner/token.dart' show Token;
import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
import '../problems.dart' show internalProblem;
import '../problems.dart' show internalProblem, unsupported;
import 'kernel_body_builder.dart' show KernelBodyBuilder;
import 'kernel_builder.dart'
show
Declaration,
ImplicitType,
FieldBuilder,
KernelLibraryBuilder,
KernelTypeBuilder,
@ -32,16 +31,9 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
final ShadowField field;
final List<MetadataBuilder> metadata;
final KernelTypeBuilder type;
Token initializerTokenForInference;
KernelFieldBuilder(
this.metadata,
this.type,
String name,
int modifiers,
Declaration compilationUnit,
int charOffset,
this.initializerTokenForInference)
KernelFieldBuilder(this.metadata, this.type, String name, int modifiers,
Declaration compilationUnit, int charOffset)
: field = new ShadowField(null, type == null,
fileUri: compilationUnit?.fileUri)
..fileOffset = charOffset,
@ -90,10 +82,16 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
.createTopLevelTypeInferrer(
field.enclosingClass?.thisType, field, null);
if (hasInitializer) {
if (field.type is! ImplicitType) {
unsupported(
"$name has unexpected type ${field.type}", charOffset, fileUri);
return;
}
ImplicitType type = field.type;
field.type = const DynamicType();
initializer = new KernelBodyBuilder.forField(this, typeInferrer)
.parseFieldInitializer(initializerTokenForInference);
.parseFieldInitializer(type.initializerToken);
}
initializerTokenForInference = null;
}
@override

View file

@ -117,6 +117,7 @@ import 'kernel_builder.dart'
DynamicTypeBuilder,
EnumConstantInfo,
FormalParameterBuilder,
ImplicitType,
InvalidTypeBuilder,
KernelClassBuilder,
KernelConstructorBuilder,
@ -600,9 +601,13 @@ class KernelLibraryBuilder
if (hasInitializer) {
modifiers |= hasInitializerMask;
}
KernelFieldBuilder field = new KernelFieldBuilder(metadata, type, name,
modifiers, this, charOffset, initializerTokenForInference);
KernelFieldBuilder field = new KernelFieldBuilder(
metadata, type, name, modifiers, this, charOffset);
addBuilder(name, field, charOffset);
if (initializerTokenForInference != null) {
assert(type == null);
field.target.type = new ImplicitType(field, initializerTokenForInference);
}
loader.target.metadataCollector
?.setDocumentationComment(field.target, documentationComment);
}

View file

@ -1508,6 +1508,8 @@ class OutlineBuilder extends StackListener {
// the tokens for the expression.
// TODO(ahe): Might be clearer if this search was moved to
// `library.addFields`.
// TODO(ahe): I don't even think this is necessary. [token] points to ;
// or , and we don't otherwise store tokens.
beforeLast = next;
next = next.next;
}

View file

@ -246,9 +246,12 @@ class SourceClassBuilder extends KernelClassBuilder
void prepareTopLevelInference() {
scope.forEach((String name, Declaration declaration) {
if (declaration is KernelFieldBuilder) {
declaration.prepareTopLevelInference();
}
do {
if (declaration is KernelFieldBuilder) {
declaration.prepareTopLevelInference();
}
declaration = declaration.next;
} while (declaration != null);
});
if (!isPatch) {
cls.setupApiMembers(library.loader.interfaceResolver);

View file

@ -46,13 +46,17 @@ class Print extends Step<Component, Component, ChainContext> {
Future<Result<Component>> run(Component component, _) async {
StringBuffer sb = new StringBuffer();
for (Library library in component.libraries) {
Printer printer = new Printer(sb);
if (library.importUri.scheme != "dart" &&
library.importUri.scheme != "package") {
printer.writeLibraryFile(library);
await CompilerContext.runWithDefaultOptions((compilerContext) async {
compilerContext.uriToSource.addAll(component.uriToSource);
for (Library library in component.libraries) {
Printer printer = new Printer(sb);
if (library.importUri.scheme != "dart" &&
library.importUri.scheme != "package") {
printer.writeLibraryFile(library);
}
}
}
});
print("$sb");
return pass(component);
}

View file

@ -559,7 +559,7 @@ class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_dec
;
}
class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
field dynamic field = null;
field core::String field = null;
constructor •(dynamic a) → self::C#2
: super core::Object::•()
;
@ -580,7 +580,7 @@ class C#1 extends core::Object {
;
}
class C extends core::Object {
field dynamic field = null;
field core::String field = null;
constructor •(dynamic a) → self::C
: super core::Object::•()
;