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

Unified Diff: pkg/analyzer/lib/src/dart/sdk/patch.dart

Issue 2417933002: Add support for patching constructors. (Closed)
Patch Set: Created 4 years, 2 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 | « no previous file | pkg/analyzer/test/src/dart/sdk/patch_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/dart/sdk/patch.dart
diff --git a/pkg/analyzer/lib/src/dart/sdk/patch.dart b/pkg/analyzer/lib/src/dart/sdk/patch.dart
index f2bfeb30cb8643607a550a3506f5dabb95d4e898..e6475c3a028e7ae4d5f37be559c2967e5563eabe 100644
--- a/pkg/analyzer/lib/src/dart/sdk/patch.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/patch.dart
@@ -127,9 +127,71 @@ class SdkPatcher {
_failIfPublicName(patchMember, name);
membersToAppend.add(patchMember);
}
+ } else if (patchMember is ConstructorDeclaration) {
+ String name = patchMember.name?.name;
+ if (_hasPatchAnnotation(patchMember.metadata)) {
+ for (ClassMember baseMember in baseClass.members) {
+ if (baseMember is ConstructorDeclaration &&
+ baseMember.name?.name == name) {
+ // Remove the "external" keyword.
+ Token externalKeyword = baseMember.externalKeyword;
+ if (externalKeyword != null) {
+ baseMember.externalKeyword = null;
+ _removeToken(externalKeyword);
+ } else {
+ _failExternalKeyword(name, baseMember.offset);
+ }
+ // Factory vs. generative.
+ if (baseMember.factoryKeyword == null &&
+ patchMember.factoryKeyword != null) {
+ _failInPatch(
+ 'attempts to replace generative constructor with a factory one',
+ patchMember.offset);
+ } else if (baseMember.factoryKeyword != null &&
+ patchMember.factoryKeyword == null) {
+ _failInPatch(
+ 'attempts to replace factory constructor with a generative one',
+ patchMember.offset);
+ }
+ // The base constructor should not have initializers.
+ if (baseMember.initializers.isNotEmpty) {
+ throw new ArgumentError(
+ 'Cannot patch external constructors with initializers '
+ 'in $_baseDesc.');
+ }
+ // Prepare nodes.
+ FunctionBody baseBody = baseMember.body;
+ FunctionBody patchBody = patchMember.body;
+ NodeList<ConstructorInitializer> baseInitializers =
+ baseMember.initializers;
+ NodeList<ConstructorInitializer> patchInitializers =
+ patchMember.initializers;
+ // Replace initializers and link tokens.
+ if (patchInitializers.isNotEmpty) {
+ baseMember.parameters.endToken
+ .setNext(patchInitializers.beginToken.previous);
+ baseInitializers.addAll(patchInitializers);
+ patchBody.endToken.setNext(baseBody.endToken.next);
+ } else {
+ _replaceNodeTokens(baseBody, patchBody);
+ }
+ // Replace the body.
+ baseMember.body = patchBody;
+ }
+ }
+ } else {
+ if (name == null) {
+ if (!Identifier.isPrivateName(baseClass.name.name)) {
+ _failInPatch(
+ 'contains an unnamed public constructor', patchMember.offset);
+ }
+ } else {
+ _failIfPublicName(patchMember, name);
+ }
+ membersToAppend.add(patchMember);
+ }
} else {
// TODO(scheglov) support field
- // TODO(scheglov) support constructors
String className = patchClass.name.name;
_failInPatch('contains an unsupported class member in $className',
patchMember.offset);
« no previous file with comments | « no previous file | pkg/analyzer/test/src/dart/sdk/patch_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698