KT-1066 false 'Variable cannot be initialized before declaration'
This commit is contained in:
@@ -429,18 +429,20 @@ public class JetFlowInformationProvider {
|
|||||||
Map<VariableDescriptor, VariableInitializers> exitInstructionData = Maps.newHashMap(enterInstructionData);
|
Map<VariableDescriptor, VariableInitializers> exitInstructionData = Maps.newHashMap(enterInstructionData);
|
||||||
if (instruction instanceof WriteValueInstruction) {
|
if (instruction instanceof WriteValueInstruction) {
|
||||||
VariableDescriptor variable = extractVariableDescriptorIfAny(instruction, false);
|
VariableDescriptor variable = extractVariableDescriptorIfAny(instruction, false);
|
||||||
VariableInitializers initializationAtThisElement = new VariableInitializers(((WriteValueInstruction) instruction).getElement());
|
VariableInitializers enterInitializers = enterInstructionData.get(variable);
|
||||||
|
VariableInitializers initializationAtThisElement = new VariableInitializers(((WriteValueInstruction) instruction).getElement(), enterInitializers);
|
||||||
exitInstructionData.put(variable, initializationAtThisElement);
|
exitInstructionData.put(variable, initializationAtThisElement);
|
||||||
}
|
}
|
||||||
else if (instruction instanceof VariableDeclarationInstruction) {
|
else if (instruction instanceof VariableDeclarationInstruction) {
|
||||||
VariableDescriptor variable = extractVariableDescriptorIfAny(instruction, false);
|
VariableDescriptor variable = extractVariableDescriptorIfAny(instruction, false);
|
||||||
VariableInitializers enterInitializers = enterInstructionData.get(variable);
|
VariableInitializers enterInitializers = enterInstructionData.get(variable);
|
||||||
if (enterInitializers == null || !enterInitializers.isInitialized()) {
|
if (enterInitializers == null || !enterInitializers.isInitialized() || !enterInitializers.isDeclared()) {
|
||||||
JetElement element = ((VariableDeclarationInstruction) instruction).getElement();
|
JetElement element = ((VariableDeclarationInstruction) instruction).getElement();
|
||||||
if (element instanceof JetProperty) {
|
if (element instanceof JetProperty) {
|
||||||
JetProperty property = (JetProperty) element;
|
JetProperty property = (JetProperty) element;
|
||||||
if (property.getInitializer() == null) {
|
if (property.getInitializer() == null) {
|
||||||
VariableInitializers variableDeclarationInfo = new VariableInitializers(false, true);
|
boolean isInitialized = enterInitializers != null && enterInitializers.isInitialized();
|
||||||
|
VariableInitializers variableDeclarationInfo = new VariableInitializers(isInitialized, true);
|
||||||
exitInstructionData.put(variable, variableDeclarationInfo);
|
exitInstructionData.put(variable, variableDeclarationInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -640,7 +642,7 @@ public class JetFlowInformationProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Util methods
|
// Util methods 7
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private VariableDescriptor extractVariableDescriptorIfAny(Instruction instruction, boolean onlyReference) {
|
private VariableDescriptor extractVariableDescriptorIfAny(Instruction instruction, boolean onlyReference) {
|
||||||
@@ -709,9 +711,9 @@ public class JetFlowInformationProvider {
|
|||||||
this.isDeclared = isDeclared;
|
this.isDeclared = isDeclared;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VariableInitializers(JetElement element) {
|
public VariableInitializers(JetElement element, @Nullable VariableInitializers previous) {
|
||||||
isInitialized = true;
|
isInitialized = true;
|
||||||
isDeclared = element instanceof JetProperty;
|
isDeclared = element instanceof JetProperty || (previous != null && previous.isDeclared());
|
||||||
possibleLocalInitializers.add(element);
|
possibleLocalInitializers.add(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -748,8 +750,11 @@ public class JetFlowInformationProvider {
|
|||||||
|
|
||||||
VariableInitializers that = (VariableInitializers) o;
|
VariableInitializers that = (VariableInitializers) o;
|
||||||
|
|
||||||
|
if (isDeclared != that.isDeclared) return false;
|
||||||
if (isInitialized != that.isInitialized) return false;
|
if (isInitialized != that.isInitialized) return false;
|
||||||
if (possibleLocalInitializers != null ? !possibleLocalInitializers.equals(that.possibleLocalInitializers) : that.possibleLocalInitializers != null) {
|
if (possibleLocalInitializers != null
|
||||||
|
? !possibleLocalInitializers.equals(that.possibleLocalInitializers)
|
||||||
|
: that.possibleLocalInitializers != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,6 +765,7 @@ public class JetFlowInformationProvider {
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = possibleLocalInitializers != null ? possibleLocalInitializers.hashCode() : 0;
|
int result = possibleLocalInitializers != null ? possibleLocalInitializers.hashCode() : 0;
|
||||||
result = 31 * result + (isInitialized ? 1 : 0);
|
result = 31 * result + (isInitialized ? 1 : 0);
|
||||||
|
result = 31 * result + (isDeclared ? 1 : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
//KT-1066 false 'Variable cannot be initialized before declaration'
|
||||||
|
//+JDK
|
||||||
|
|
||||||
|
package kt1066
|
||||||
|
|
||||||
|
import java.util.Set
|
||||||
|
|
||||||
|
fun randomDigit() = 0.chr
|
||||||
|
|
||||||
|
fun foo(excluded: Set<Char>) {
|
||||||
|
var digit : Char
|
||||||
|
|
||||||
|
do {
|
||||||
|
digit = randomDigit()
|
||||||
|
// ^^^^^ here!
|
||||||
|
} while (excluded.contains(digit))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
var sum : Int = 0
|
||||||
|
var first : Int = 1
|
||||||
|
var second : Int = 2
|
||||||
|
var temp : Int //= 0 // variable 'temp' initializer is redundant
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (second > 4000000)
|
||||||
|
break
|
||||||
|
|
||||||
|
if (second % 2 == 0)
|
||||||
|
sum += second
|
||||||
|
|
||||||
|
temp = second
|
||||||
|
second = first + second
|
||||||
|
first = temp
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user