Skip to content

Commit 6c0c7bc

Browse files
Completing record component in compact constructor throws NPE (eclipse-jdt#4132)
* Fixes eclipse-jdt#4131
1 parent 91ee299 commit 6c0c7bc

File tree

19 files changed

+91
-145
lines changed

19 files changed

+91
-145
lines changed

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ClassFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ public int generateTypeAnnotationsOnCodeAttribute() {
16191619
for (int i = 0, max = this.codeStream.allLocalsCounter; i < max; i++) {
16201620
LocalVariableBinding localVariable = this.codeStream.locals[i];
16211621
if (localVariable.isCatchParameter()) continue;
1622-
LocalDeclaration declaration = localVariable.declaration;
1622+
AbstractVariableDeclaration declaration = localVariable.declaration;
16231623
if (declaration == null
16241624
|| (declaration.isArgument() && ((declaration.bits & ASTNode.IsUnionType) == 0))
16251625
|| (localVariable.initializationCount == 0)

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/apt/dispatch/BaseMessagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626
import org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl;
2727
import org.eclipse.jdt.internal.compiler.apt.model.VariableElementImpl;
2828
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
29+
import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
2930
import org.eclipse.jdt.internal.compiler.ast.Annotation;
3031
import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
3132
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
3233
import org.eclipse.jdt.internal.compiler.ast.Expression;
3334
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
34-
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
3535
import org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
3636
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
3737
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
@@ -135,7 +135,7 @@ public static AptProblem createProblem(Kind kind, CharSequence msg, Element e,
135135
}
136136
} else if (binding instanceof AptSourceLocalVariableBinding){
137137
AptSourceLocalVariableBinding parameterBinding = (AptSourceLocalVariableBinding) binding;
138-
LocalDeclaration parameterDeclaration = parameterBinding.declaration;
138+
AbstractVariableDeclaration parameterDeclaration = parameterBinding.declaration;
139139
if (parameterDeclaration != null) {
140140
MethodBinding methodBinding = parameterBinding.methodBinding;
141141
if (methodBinding != null) {

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ public static void resolveAnnotations(BlockScope scope, Annotation[] sourceAnnot
863863
}
864864
} else if (annotations != null) {
865865
// One of the annotations at least is a SuppressWarnings annotation
866-
LocalDeclaration localDeclaration = local.declaration;
866+
AbstractVariableDeclaration localDeclaration = local.declaration;
867867
int declarationSourceEnd = localDeclaration.declarationSourceEnd;
868868
int declarationSourceStart = localDeclaration.declarationSourceStart;
869869
for (int j = 0; j < length; j++) {

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/AbstractVariableDeclaration.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
2626
import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
2727
import org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
28+
import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
2829
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
2930
import org.eclipse.jdt.internal.compiler.lookup.Scope;
3031
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
@@ -80,6 +81,10 @@ public InferenceContext18 freshInferenceContext(Scope scope) {
8081
return null;
8182
}
8283

84+
public boolean isArgument() {
85+
return false;
86+
}
87+
8388
@Override
8489
public boolean isSuperAccess() {
8590
return false;
@@ -162,6 +167,10 @@ public boolean isUnnamed(Scope scope) {
162167
return this.name.length == 1 && this.name[0] == '_' && JavaFeature.UNNAMMED_PATTERNS_AND_VARS.isSupported(scope.compilerOptions().sourceLevel, scope.compilerOptions().enablePreviewFeatures);
163168
}
164169

170+
public boolean isTypeNameVar(Scope scope) {
171+
return this.type != null && this.type.isTypeNameVar(scope);
172+
}
173+
165174
public void getAllAnnotationContexts(int targetType, List<AnnotationContext> allAnnotationContexts) {
166175
// do nothing
167176
}
@@ -170,6 +179,10 @@ public void getAllAnnotationContexts(int targetType, int parameterIndex, List<An
170179
// do nothing
171180
}
172181

182+
public void getAllAnnotationContexts(int targetType, LocalVariableBinding localVariable, List<AnnotationContext> allTypeAnnotationContexts) {
183+
// do nothing
184+
}
185+
173186
public abstract Binding getBinding();
174187

175188
public abstract void setBinding(Binding binding);

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Annotation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ public TypeBinding resolveType(BlockScope scope) {
10791079
variable.tagBits &= ~TagBits.AnnotationNullMASK; // avoid secondary problems
10801080
}
10811081
if ((tagBits & TagBits.AnnotationSuppressWarnings) != 0) {
1082-
LocalDeclaration localDeclaration = variable.declaration;
1082+
AbstractVariableDeclaration localDeclaration = variable.declaration;
10831083
recordSuppressWarnings(scope, localDeclaration.declarationSourceStart, localDeclaration.declarationSourceEnd, compilerOptions.suppressWarnings);
10841084
}
10851085
// note: defaultNullness for local declarations has been already been handled earlier by handleNonNullByDefault()

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,13 +265,7 @@ else if (expression instanceof ConditionalExpression) {
265265
return null;
266266
// tracking var doesn't yet exist. This happens in finally block
267267
// which is analyzed before the corresponding try block
268-
ASTNode location = local.declaration;
269-
if (location == null && local.isParameter() && local.declaringScope != null) {
270-
if (local.declaringScope.referenceContext() instanceof ConstructorDeclaration cd && cd.isCompactConstructor()) {
271-
TypeDeclaration referenceType = local.declaringScope.referenceType();
272-
location = referenceType.binding.getRecordComponent(local.name);
273-
}
274-
}
268+
Statement location = local.declaration;
275269
local.closeTracker = new FakedTrackingVariable(local, location, flowInfo, flowContext, FlowInfo.UNKNOWN, useAnnotations);
276270
if (local.isParameter()) {
277271
local.closeTracker.globalClosingState |= OWNED_BY_OUTSIDE;

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
5858
import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
5959
import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
60-
import org.eclipse.jdt.internal.compiler.lookup.Scope;
6160
import org.eclipse.jdt.internal.compiler.lookup.TagBits;
6261
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
6362
import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner;
@@ -198,7 +197,7 @@ public int getKind() {
198197
return LOCAL_VARIABLE;
199198
}
200199

201-
// for local variables
200+
@Override
202201
public void getAllAnnotationContexts(int targetType, LocalVariableBinding localVariable, List<AnnotationContext> allAnnotationContexts) {
203202
AnnotationCollector collector = new AnnotationCollector(this, targetType, localVariable, allAnnotationContexts);
204203
this.traverseWithoutInitializer(collector, (BlockScope) null);
@@ -211,9 +210,6 @@ public void getAllAnnotationContexts(int targetType, int parameterIndex, List<An
211210
this.traverse(collector, (BlockScope) null);
212211
}
213212

214-
public boolean isArgument() {
215-
return false;
216-
}
217213
public boolean isReceiver() {
218214
return false;
219215
}
@@ -517,10 +513,6 @@ public boolean isRecoveredFromLoneIdentifier() { // recovered from lonely identi
517513
(this.type instanceof SingleTypeReference || (this.type instanceof QualifiedTypeReference && !(this.type instanceof ArrayQualifiedTypeReference))) && this.initialization == null && !this.type.isBaseTypeReference();
518514
}
519515

520-
public boolean isTypeNameVar(Scope scope) {
521-
return this.type != null && this.type.isTypeNameVar(scope);
522-
}
523-
524516
@Override
525517
public LocalVariableBinding getBinding() {
526518
return this.binding;

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Reference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,12 @@ static void reportOnlyUselesslyReadLocal(BlockScope currentScope, LocalVariableB
259259

260260
if (shouldReport) {
261261
// report the case of an argument that is unread except through a special operator
262-
currentScope.problemReporter().unusedArgument(localBinding.declaration);
262+
currentScope.problemReporter().unusedArgument((LocalDeclaration) localBinding.declaration);
263263
}
264264
}
265265
} else {
266266
// report the case of a local variable that is unread except for a special operator
267-
currentScope.problemReporter().unusedLocalVariable(localBinding.declaration);
267+
currentScope.problemReporter().unusedLocalVariable((LocalDeclaration) localBinding.declaration);
268268
}
269269
}
270270
}

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,13 @@ String basicToString(int tab) {
213213

214214
private void checkAndSetModifiersForVariable(LocalVariableBinding varBinding) {
215215
int modifiers = varBinding.modifiers;
216-
if ((modifiers & ExtraCompilerModifiers.AccAlternateModifierProblem) != 0 && varBinding.declaration != null){
216+
if ((modifiers & ExtraCompilerModifiers.AccAlternateModifierProblem) != 0 && varBinding.declaration != null) {
217217
problemReporter().duplicateModifierForVariable(varBinding.declaration, this instanceof MethodScope);
218218
}
219219
int realModifiers = modifiers & ExtraCompilerModifiers.AccJustFlag;
220220

221221
int unexpectedModifiers = ~ClassFileConstants.AccFinal;
222-
if ((realModifiers & unexpectedModifiers) != 0 && varBinding.declaration != null){
222+
if ((realModifiers & unexpectedModifiers) != 0 && varBinding.declaration != null) {
223223
problemReporter().illegalModifierForVariable(varBinding.declaration, this instanceof MethodScope);
224224
}
225225
varBinding.modifiers = modifiers;
@@ -313,10 +313,10 @@ void computeLocalVariablePositions(int ilocal, int initOffset, CodeStream codeSt
313313
&& !local.declaration.isUnnamed(local.declaringScope)) {
314314

315315
if (local.isCatchParameter()) {
316-
problemReporter().unusedExceptionParameter(local.declaration); // report unused catch arguments
316+
problemReporter().unusedExceptionParameter((LocalDeclaration) local.declaration); // report unused catch arguments
317317
}
318318
else {
319-
problemReporter().unusedLocalVariable(local.declaration);
319+
problemReporter().unusedLocalVariable((LocalDeclaration) local.declaration);
320320
}
321321
}
322322

@@ -444,61 +444,6 @@ public final ReferenceBinding findLocalType(char[] name) {
444444
return null;
445445
}
446446

447-
/**
448-
* Returns all declarations of most specific locals containing a given position in their source range.
449-
* This code does not recurse in nested types.
450-
* Returned array may have null values at trailing indexes.
451-
*/
452-
public LocalDeclaration[] findLocalVariableDeclarations(int position) {
453-
// local variable init
454-
int ilocal = 0, maxLocals = this.localIndex;
455-
boolean hasMoreVariables = maxLocals > 0;
456-
LocalDeclaration[] localDeclarations = null;
457-
int declPtr = 0;
458-
459-
// scope init
460-
int iscope = 0, maxScopes = this.subscopeCount;
461-
boolean hasMoreScopes = maxScopes > 0;
462-
463-
// iterate scopes and variables in parallel
464-
while (hasMoreVariables || hasMoreScopes) {
465-
if (hasMoreScopes
466-
&& (!hasMoreVariables || (this.subscopes[iscope].startIndex() <= ilocal))) {
467-
// consider subscope first
468-
Scope subscope = this.subscopes[iscope];
469-
if (subscope.kind == Scope.BLOCK_SCOPE) { // do not dive in nested types
470-
localDeclarations = ((BlockScope)subscope).findLocalVariableDeclarations(position);
471-
if (localDeclarations != null) {
472-
return localDeclarations;
473-
}
474-
}
475-
hasMoreScopes = ++iscope < maxScopes;
476-
} else {
477-
// consider variable first
478-
LocalVariableBinding local = this.locals[ilocal]; // if no local at all, will be locals[ilocal]==null
479-
if (local != null && (local.modifiers & ExtraCompilerModifiers.AccOutOfFlowScope) == 0) {
480-
LocalDeclaration localDecl = local.declaration;
481-
if (localDecl != null) {
482-
if (localDecl.declarationSourceStart <= position) {
483-
if (position <= localDecl.declarationSourceEnd) {
484-
if (localDeclarations == null) {
485-
localDeclarations = new LocalDeclaration[maxLocals];
486-
}
487-
localDeclarations[declPtr++] = localDecl;
488-
}
489-
} else {
490-
return localDeclarations;
491-
}
492-
}
493-
}
494-
hasMoreVariables = ++ilocal < maxLocals;
495-
if (!hasMoreVariables && localDeclarations != null) {
496-
return localDeclarations;
497-
}
498-
}
499-
}
500-
return null;
501-
}
502447
@Override
503448
public LocalVariableBinding findVariable(char[] variableName) {
504449
int varLength = variableName.length;

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,7 @@
2626
import java.util.HashSet;
2727
import java.util.Set;
2828
import org.eclipse.jdt.core.compiler.CharOperation;
29-
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
30-
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
31-
import org.eclipse.jdt.internal.compiler.ast.Annotation;
32-
import org.eclipse.jdt.internal.compiler.ast.Expression;
33-
import org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable;
34-
import org.eclipse.jdt.internal.compiler.ast.Initializer;
35-
import org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
36-
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
37-
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
29+
import org.eclipse.jdt.internal.compiler.ast.*;
3830
import org.eclipse.jdt.internal.compiler.impl.Constant;
3931
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
4032

@@ -48,7 +40,7 @@ public class LocalVariableBinding extends VariableBinding {
4840
public int useFlag; // for flow analysis (default is UNUSED), values < 0 indicate the number of compound uses (postIncrement or compoundAssignment)
4941

5042
public BlockScope declaringScope; // back-pointer to its declaring scope
51-
public LocalDeclaration declaration; // for source-positions
43+
public AbstractVariableDeclaration declaration; // for source-positions
5244

5345
public int[] initializationPCs;
5446
public int initializationCount = 0;

0 commit comments

Comments
 (0)