diff options
author | Manoj Palat | 2020-05-05 12:56:50 +0000 |
---|---|---|
committer | Manoj Palat | 2020-05-05 12:56:50 +0000 |
commit | f3da8e568a49f24deb97b9ffca636152eaad1255 (patch) | |
tree | d97b6182d25478e759592d8ca793626b55891a20 | |
parent | 18c2e0b07c1a4401acd684bdf060611d46df69b9 (diff) | |
download | eclipse.jdt.core-f3da8e568a49f24deb97b9ffca636152eaad1255.tar.gz eclipse.jdt.core-f3da8e568a49f24deb97b9ffca636152eaad1255.tar.xz eclipse.jdt.core-f3da8e568a49f24deb97b9ffca636152eaad1255.zip |
Bug 562439 - [14][compiler][internal] Record components to have separate
compiler.ast.node and bindings - follow up for accessor annot
Change-Id: I6abe0fbe76a29fe87ac772fe6ef9ab325be4a1ad
5 files changed, 58 insertions, 20 deletions
diff --git a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java index 08e41e9faf..dcbd1a799a 100644 --- a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java +++ b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.ModuleDeclaration; +import org.eclipse.jdt.internal.compiler.ast.RecordComponent; import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; import org.eclipse.jdt.internal.compiler.ast.TypeParameter; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; @@ -40,6 +41,7 @@ import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; import org.eclipse.jdt.internal.compiler.lookup.MethodScope; import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding; +import org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding; import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding; @@ -137,6 +139,22 @@ public class AnnotationDiscoveryVisitor extends ASTVisitor { } @Override + public boolean visit(RecordComponent recordComponent, BlockScope scope) { + Annotation[] annotations = recordComponent.annotations; + if (annotations != null) { + RecordComponentBinding recordComponentBinding = recordComponent.binding; + if (recordComponentBinding == null) { + return false; + } + ((SourceTypeBinding) recordComponentBinding.declaringRecord).resolveTypeFor(recordComponentBinding); + if (recordComponent.binding == null) { + return false; + } + this.resolveAnnotations(scope, annotations, recordComponentBinding); + } + return false; + } + @Override public boolean visit(TypeParameter typeParameter, ClassScope scope) { Annotation[] annotations = typeParameter.annotations; if (annotations != null) { diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java index bd63ce21a5..22cde62aaa 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java @@ -1213,23 +1213,40 @@ public abstract class ASTNode implements TypeConstants, TypeIds { } return filteredAnnotations.toArray(new Annotation[0]); } - public static Annotation[] copyRecordComponentAnnotations(Scope scope, - Binding recipient, Annotation[] annotations, - long rcMask) { - + public static Annotation[] copyRecordComponentAnnotations(Scope scope, Binding recipient, Annotation[] annotations) { if (annotations == null || annotations.length == 0 || recipient == null) return null; - List<AnnotationBinding> relevantAnnotations = new ArrayList<>(); - Annotation[] filteredAnnotations = ASTNode.getRelevantAnnotations(annotations, rcMask, relevantAnnotations); - int sz = relevantAnnotations.size(); - if (sz > 0) { - AnnotationBinding [] recipientAnnotations = relevantAnnotations.toArray(new AnnotationBinding[sz]); - // note: forcing to store in the bindings since we require at codegen - recipient.setAnnotations(recipientAnnotations, scope, true /* forceStore*/); + long recipientTargetMask = 0; + switch (recipient.kind()) { + case Binding.LOCAL: + assert recipient.isParameter(); // only for implicit canonical constructor arguments + recipientTargetMask = recipient.isParameter() ? TagBits.AnnotationForParameter : TagBits.AnnotationForLocalVariable; + break; + case Binding.FIELD: + recipientTargetMask = TagBits.AnnotationForField; + break; + case Binding.METHOD: + MethodBinding method = (MethodBinding) recipient; + recipientTargetMask = method.isConstructor() ? TagBits.AnnotationForConstructor : TagBits.AnnotationForMethod; + break; + case Binding.RECORD_COMPONENT: + // Use it on record component itself to filter out non-record component annotations. + recipientTargetMask = TagBits.AnnotationForRecordComponent; + break; + default: + return null; } + // TODO: Null Analysis Address via bug 562478? + + recipientTargetMask |= TagBits.AnnotationForTypeUse; + List<AnnotationBinding> relevantAnnotations = new ArrayList<>(); + Annotation[] filteredAnnotations = ASTNode.getRelevantAnnotations(annotations, recipientTargetMask, relevantAnnotations); + AnnotationBinding [] recipientAnnotations = relevantAnnotations.toArray(new AnnotationBinding[relevantAnnotations.size()]); + recipient.setAnnotations(recipientAnnotations, scope, true /* forceStore*/);// forceStore since we require at codegen return filteredAnnotations; } + private static TypeBinding mergeAnnotationsIntoType(BlockScope scope, AnnotationBinding[] se8Annotations, long se8nullBits, Annotation se8NullAnnotation, TypeReference typeRef, TypeBinding existingType) { diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java index 4b49185be5..82ae705d15 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java @@ -99,8 +99,10 @@ public class Argument extends LocalDeclaration { MethodBinding methodBinding = methodDecl.binding; ReferenceBinding referenceBinding = methodBinding== null ? null : methodBinding.declaringClass; if (referenceBinding instanceof SourceTypeBinding) { - assert ((SourceTypeBinding) referenceBinding).isRecord(); - RecordComponentBinding recordComponentBinding = ((SourceTypeBinding) referenceBinding).getRecordComponent(this.name); + SourceTypeBinding sourceTypeBinding = (SourceTypeBinding) referenceBinding; + assert (sourceTypeBinding.isRecord()); + sourceTypeBinding.components(); + RecordComponentBinding recordComponentBinding = sourceTypeBinding.getRecordComponent(this.name); RecordComponent recordComponent = recordComponentBinding.sourceRecordComponent(); return recordComponent.annotations; } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java index be50329b94..a5ae9d924c 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java @@ -1116,9 +1116,11 @@ public RecordComponentBinding[] components() { for (FieldBinding f : this.fields) { if (f.isRecordComponent() && CharOperation.equals(f.name, rcb.name)) { smb.targetReadField = f; - long rcMask = TagBits.AnnotationForMethod | TagBits.AnnotationForTypeUse; ASTNode.copyRecordComponentAnnotations(this.scope, smb, - rcb.sourceRecordComponent().annotations, rcMask); + rcb.sourceRecordComponent().annotations); + // Note: a) type use bit set above and b) reusing rcb type, so + // copySE8Annot already done for rcb.type, hence not + // required here (tricky on an SMB without ast) break; } } @@ -1143,7 +1145,7 @@ public RecordComponentBinding[] components() { return this.components; } -private Object resolveTypeFor(RecordComponentBinding component) { +public RecordComponentBinding resolveTypeFor(RecordComponentBinding component) { if (!isPrototype()) return this.prototype.resolveTypeFor(component); @@ -1193,10 +1195,11 @@ private Object resolveTypeFor(RecordComponentBinding component) { if (leafType instanceof ReferenceBinding && (((ReferenceBinding)leafType).modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0) { component.modifiers |= ExtraCompilerModifiers.AccGenericSignature; } + Annotation [] annotations = componentDecl.annotations; + ASTNode.copyRecordComponentAnnotations(initializationScope, component, annotations); long sourceLevel = this.scope.compilerOptions().sourceLevel; if (sourceLevel >= ClassFileConstants.JDK1_8) { - Annotation [] annotations = componentDecl.annotations; if (annotations != null && annotations.length != 0) { // piggybacking on an existing method to move type_use annotations to type in record component ASTNode.copySE8AnnotationsToType(initializationScope, component, annotations, false); @@ -2307,9 +2310,8 @@ public FieldBinding resolveTypeFor(FieldBinding field) { if (field.isRecordComponent()) { RecordComponentBinding rcb = getRecordComponent(field.name); assert rcb != null; - long rcMask = TagBits.AnnotationForField | TagBits.AnnotationForTypeUse; relevantRecordComponentAnnotations = ASTNode.copyRecordComponentAnnotations(initializationScope, - field, rcb.sourceRecordComponent().annotations, rcMask); + field, rcb.sourceRecordComponent().annotations); } } if (sourceLevel >= ClassFileConstants.JDK1_8) { diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java index b223726e6b..53cece980a 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java @@ -462,7 +462,6 @@ public class SyntheticMethodBinding extends MethodBinding { this.purpose = SyntheticMethodBinding.FieldReadAccess; this.thrownExceptions = Binding.NO_EXCEPTIONS; this.declaringClass = declaringSourceType; - this.setTypeAnnotations(rcb.getAnnotations()); this.index = index; this.sourceStart = rcb.sourceRecordComponent().sourceStart; } |