mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 20:19:23 +00:00
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:
parent
a6e37888ee
commit
bf5ae2215b
33
pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
Normal file
33
pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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::•()
|
||||
;
|
||||
|
|
Loading…
Reference in a new issue