Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManoj Palat2020-05-05 12:56:50 +0000
committerManoj Palat2020-05-05 12:56:50 +0000
commitf3da8e568a49f24deb97b9ffca636152eaad1255 (patch)
treed97b6182d25478e759592d8ca793626b55891a20
parent18c2e0b07c1a4401acd684bdf060611d46df69b9 (diff)
downloadeclipse.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
-rw-r--r--org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/dispatch/AnnotationDiscoveryVisitor.java18
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java39
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Argument.java6
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java14
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SyntheticMethodBinding.java1
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;
}

Back to the top