Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(864)

Unified Diff: pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart

Issue 2983773002: Resynthesize expressions for Kernel's StaticGet and PropertyGet. (Closed)
Patch Set: Resynthesize ClassName.StaticElement for Kernel. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/test/src/summary/resynthesize_common.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index d0fae3c91e6f228d6d1886f0975902f12e5a9cf3..3e7e9bd50b8cb82ee45dbc49c86237e2c28e097a 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -8,6 +8,7 @@ import 'dart:async';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
@@ -42,6 +43,9 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
final resourceProvider = new MemoryResourceProvider(context: pathos.posix);
@override
+ bool get isSharedFrontEnd => true;
+
+ @override
bool get isStrongMode => true;
@override
@@ -224,11 +228,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_class_field_const() async {
- await super.test_class_field_const();
- }
-
- @failingTest
test_class_interfaces_unresolved() async {
await super.test_class_interfaces_unresolved();
}
@@ -406,11 +405,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_const_length_ofClassConstField() async {
- await super.test_const_length_ofClassConstField();
- }
-
- @failingTest
test_const_length_ofClassConstField_imported() async {
await super.test_const_length_ofClassConstField_imported();
}
@@ -421,16 +415,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_const_length_ofStringLiteral() async {
- await super.test_const_length_ofStringLiteral();
- }
-
- @failingTest
- test_const_length_ofTopLevelVariable() async {
- await super.test_const_length_ofTopLevelVariable();
- }
-
- @failingTest
test_const_length_ofTopLevelVariable_imported() async {
await super.test_const_length_ofTopLevelVariable_imported();
}
@@ -468,11 +452,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_const_reference_staticField() async {
- await super.test_const_reference_staticField();
- }
-
- @failingTest
test_const_reference_staticField_imported() async {
await super.test_const_reference_staticField_imported();
}
@@ -643,11 +622,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_constExpr_pushReference_field_simpleIdentifier() async {
- await super.test_constExpr_pushReference_field_simpleIdentifier();
- }
-
- @failingTest
test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
}
@@ -984,11 +958,6 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
}
@failingTest
- test_field_propagatedType_const_noDep() async {
- await super.test_field_propagatedType_const_noDep();
- }
-
- @failingTest
test_field_propagatedType_final_dep_inLib() async {
await super.test_field_propagatedType_final_dep_inLib();
}
@@ -2172,6 +2141,10 @@ class ResynthesizeKernelStrongTest extends ResynthesizeTest {
* Builder of [Expression]s from [kernel.Expression]s.
*/
class _ExprBuilder {
+ final _KernelLibraryResynthesizerContextImpl _context;
+
+ _ExprBuilder(this._context);
+
Expression build(kernel.Expression expr) {
if (expr is kernel.NullLiteral) {
return AstTestFactory.nullLiteral();
@@ -2199,8 +2172,47 @@ class _ExprBuilder {
List<String> components = expr.value.split('.').toList();
return AstTestFactory.symbolLiteral(components);
}
+ if (expr is kernel.StaticGet) {
+ return _buildIdentifier(expr.targetReference, isGet: true);
+ }
+ if (expr is kernel.PropertyGet) {
+ Expression target = build(expr.receiver);
+ kernel.Reference reference = expr.interfaceTargetReference;
+ SimpleIdentifier identifier = _buildSimpleIdentifier(reference);
+ return AstTestFactory.propertyAccess(target, identifier);
+ }
// TODO(scheglov): complete getExpression
- throw new UnimplementedError('kernel: $expr');
+ throw new UnimplementedError('kernel: (${expr.runtimeType}) $expr');
+ }
+
+ Expression _buildIdentifier(kernel.Reference reference, {bool isGet: false}) {
+ Element element = _getElement(reference);
+ if (isGet && element is PropertyInducingElement) {
+ element = (element as PropertyInducingElement).getter;
+ }
+ SimpleIdentifier property = AstTestFactory.identifier3(element.displayName)
+ ..staticElement = element;
+ Element enclosingElement = element.enclosingElement;
+ if (enclosingElement is ClassElement) {
+ SimpleIdentifier classRef = AstTestFactory
+ .identifier3(enclosingElement.name)
+ ..staticElement = enclosingElement;
+ return AstTestFactory.propertyAccess(classRef, property);
+ } else {
+ return property;
+ }
+ }
+
+ SimpleIdentifier _buildSimpleIdentifier(kernel.Reference reference) {
+ String name = reference.canonicalName.name;
+ SimpleIdentifier identifier = AstTestFactory.identifier3(name);
+ Element element = _getElement(reference);
+ identifier.staticElement = element;
+ return identifier;
+ }
+
+ ElementImpl _getElement(kernel.Reference reference) {
+ return _context._getElement(reference?.canonicalName);
}
InterpolationElement _newInterpolationElement(Expression expr) {
@@ -2268,7 +2280,7 @@ class _KernelLibraryResynthesizerContextImpl
@override
Expression getExpression(kernel.Expression expression) {
- return new _ExprBuilder().build(expression);
+ return new _ExprBuilder(this).build(expression);
}
@override
@@ -2289,6 +2301,64 @@ class _KernelLibraryResynthesizerContextImpl
throw new UnimplementedError('For ${kernelType.runtimeType}');
}
+ /**
+ * Return the [ElementImpl] that corresponds to the given [name], or `null`
+ * if the corresponding element cannot be found.
+ */
+ ElementImpl _getElement(kernel.CanonicalName name) {
+ if (name == null) return null;
+ kernel.CanonicalName parentName = name.parent;
+
+ // If the parent is the root, then this name is a library.
+ if (parentName.isRoot) {
+ return _resynthesizer.getLibrary(name.name);
+ }
+
+ // Skip qualifiers.
+ bool isGetter = false;
+ bool isSetter = false;
+ bool isField = false;
+ if (parentName.name == '@getters') {
+ isGetter = true;
+ parentName = parentName.parent;
+ } else if (parentName.name == '@setters') {
+ isSetter = true;
+ parentName = parentName.parent;
+ } else if (parentName.name == '@fields') {
+ isField = true;
+ parentName = parentName.parent;
+ }
+
+ ElementImpl parentElement = _getElement(parentName);
+ if (parentElement == null) return null;
+
+ // Search in units of the library.
+ if (parentElement is LibraryElementImpl) {
+ for (CompilationUnitElement unit in parentElement.units) {
+ CompilationUnitElementImpl unitImpl = unit;
+ ElementImpl child = unitImpl.getChild(name.name);
+ if (child != null) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ // Search in the class.
+ if (parentElement is ClassElementImpl) {
+ if (isGetter) {
+ return parentElement.getGetter(name.name) as ElementImpl;
+ } else if (isSetter) {
+ return parentElement.getSetter(name.name) as ElementImpl;
+ } else if (isField) {
+ return parentElement.getField(name.name) as ElementImpl;
+ }
+ return null;
+ }
+
+ throw new UnimplementedError('Should not be reached.');
+ }
+
InterfaceType _getInterfaceType(
kernel.CanonicalName className, List<kernel.DartType> kernelArguments) {
var libraryName = className.parent;
@@ -2314,15 +2384,36 @@ class _KernelResynthesizer {
final Map<String, kernel.Library> _kernelMap;
final Map<String, LibraryElementImpl> _libraryMap = {};
+ /**
+ * Cache of [Source] objects that have already been converted from URIs.
+ */
+ final Map<String, Source> _sources = <String, Source>{};
+
_KernelResynthesizer(this._analysisContext, this._kernelMap);
LibraryElementImpl getLibrary(String uriStr) {
return _libraryMap.putIfAbsent(uriStr, () {
var kernel = _kernelMap[uriStr];
if (kernel == null) return null;
+
var libraryContext =
new _KernelLibraryResynthesizerContextImpl(this, kernel);
- return new LibraryElementImpl.forKernel(_analysisContext, libraryContext);
+ Source librarySource = _getSource(uriStr);
+ LibraryElementImpl libraryElement =
+ new LibraryElementImpl.forKernel(_analysisContext, libraryContext);
+ CompilationUnitElementImpl definingUnit =
+ libraryElement.definingCompilationUnit;
+ definingUnit.source = librarySource;
+ definingUnit.librarySource = librarySource;
+ return libraryElement;
});
}
+
+ /**
+ * Get the [Source] object for the given [uri].
+ */
+ Source _getSource(String uri) {
+ return _sources.putIfAbsent(
+ uri, () => _analysisContext.sourceFactory.forUri(uri));
+ }
}
« no previous file with comments | « pkg/analyzer/test/src/summary/resynthesize_common.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698