started work on "unused value" analysis
This commit is contained in:
@@ -356,6 +356,33 @@ public class JetFlowInformationProvider {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void markUnusedVariables(@NotNull JetElement subroutine) {
|
||||||
|
Pseudocode pseudocode = pseudocodeMap.get(subroutine);
|
||||||
|
assert pseudocode != null;
|
||||||
|
|
||||||
|
final Set<VariableDescriptor> usedVariables = Sets.newHashSet();
|
||||||
|
JetControlFlowGraphTraverser.<Void>create(pseudocode, true).traverseAndAnalyzeInstructionGraph(new JetControlFlowGraphTraverser.InstructionDataAnalyzeStrategy<Void>() {
|
||||||
|
@Override
|
||||||
|
public void execute(Instruction instruction, @Nullable Void enterData, @Nullable Void exitData) {
|
||||||
|
if (instruction instanceof ReadValueInstruction) {
|
||||||
|
VariableDescriptor variableDescriptor = extractVariableDescriptorIfAny(instruction, false);
|
||||||
|
usedVariables.add(variableDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Collection<VariableDescriptor> declaredVariables = collectDeclaredVariables(subroutine);
|
||||||
|
for (VariableDescriptor declaredVariable : declaredVariables) {
|
||||||
|
if (!usedVariables.contains(declaredVariable)) {
|
||||||
|
PsiElement element = trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declaredVariable);
|
||||||
|
if (element instanceof JetProperty) {
|
||||||
|
PsiElement nameIdentifier = ((JetProperty) element).getNameIdentifier();
|
||||||
|
PsiElement elementToMark = nameIdentifier != null ? nameIdentifier : element;
|
||||||
|
trace.report(Errors.UNUSED_VARIABLE.on((JetProperty)element, elementToMark, declaredVariable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private VariableDescriptor extractVariableDescriptorIfAny(Instruction instruction, boolean onlyReference) {
|
private VariableDescriptor extractVariableDescriptorIfAny(Instruction instruction, boolean onlyReference) {
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ public interface Errors {
|
|||||||
PsiElementOnlyDiagnosticFactory3<JetModifierListOwner, CallableMemberDescriptor, CallableMemberDescriptor, DeclarationDescriptor> VIRTUAL_MEMBER_HIDDEN = PsiElementOnlyDiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT);
|
PsiElementOnlyDiagnosticFactory3<JetModifierListOwner, CallableMemberDescriptor, CallableMemberDescriptor, DeclarationDescriptor> VIRTUAL_MEMBER_HIDDEN = PsiElementOnlyDiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT);
|
||||||
|
|
||||||
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> UNINITIALIZED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Variable ''{0}'' must be initialized", NAME);
|
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> UNINITIALIZED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Variable ''{0}'' must be initialized", NAME);
|
||||||
|
PsiElementOnlyDiagnosticFactory1<JetProperty, DeclarationDescriptor> UNUSED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(WARNING, "Variable ''{0}'' is never used", NAME);
|
||||||
PsiElementOnlyDiagnosticFactory2<JetExpression, DeclarationDescriptor, JetProperty[]> VAL_REASSIGNMENT = new PsiElementOnlyDiagnosticFactory2<JetExpression, DeclarationDescriptor, JetProperty[]>(ERROR, "Val can not be reassigned", NAME) {
|
PsiElementOnlyDiagnosticFactory2<JetExpression, DeclarationDescriptor, JetProperty[]> VAL_REASSIGNMENT = new PsiElementOnlyDiagnosticFactory2<JetExpression, DeclarationDescriptor, JetProperty[]>(ERROR, "Val can not be reassigned", NAME) {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -83,5 +83,7 @@ public class ControlFlowAnalyzer {
|
|||||||
flowInformationProvider.checkDefiniteReturn(function, expectedReturnType);
|
flowInformationProvider.checkDefiniteReturn(function, expectedReturnType);
|
||||||
|
|
||||||
flowInformationProvider.markUninitializedVariables(function.asElement(), false, inLocalDeclaration);
|
flowInformationProvider.markUninitializedVariables(function.asElement(), false, inLocalDeclaration);
|
||||||
|
|
||||||
|
// flowInformationProvider.markUnusedVariables(function.asElement());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user