private static void AnalyzeAssignmentStatementIdentifier( IdentifierNameSyntax identifier, Dictionary <string, IdentifierNameSyntax> firstVarInitializerSyntax, Dictionary <string, IdentifierNameSyntax> firstVarUsageSyntax, Dictionary <string, IdentifierNameSyntax> firstRecordChangeSyntax, NavTypeKind variableNavTypeKind) { // ISSUE: variable of a compiler-generated type CodeExpressionSyntax target = ((AssignmentStatementSyntax)identifier.Parent).Target; if (target.IsKind(SyntaxKind.IdentifierName)) { SyntaxToken identifier1 = ((SimpleNameSyntax)target).Identifier; string valueText1 = identifier1.ValueText; identifier1 = identifier.Identifier; string valueText2 = identifier1.ValueText; if (SemanticFacts.IsSameName(valueText1, valueText2)) { firstVarInitializerSyntax.AddIdentifierIfNotExist(identifier); return; } if (variableNavTypeKind == NavTypeKind.Record) { firstRecordChangeSyntax.AddIdentifierIfNotExist((IdentifierNameSyntax)target); return; } } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); }
private static void AnalyzeMemberAccessIdentifier( IdentifierNameSyntax identifier, Dictionary <string, IdentifierNameSyntax> firstVarInitializerSyntax, Dictionary <string, IdentifierNameSyntax> firstVarUsageSyntax, Dictionary <string, IdentifierNameSyntax> lastRecordModifyInvocationSyntax, Dictionary <string, IdentifierNameSyntax> firstRecordChangeSyntax, NavTypeKind variableNavTypeKind) { // ISSUE: variable of a compiler-generated type MemberAccessExpressionSyntax parent = (MemberAccessExpressionSyntax)identifier.Parent; if (variableNavTypeKind != NavTypeKind.Record) { return; } string str = string.Empty; switch (parent.Parent.Kind) { case SyntaxKind.ExpressionStatement: str = ((ExpressionStatementSyntax)parent.Parent).Expression.GetNameStringValue(); break; case SyntaxKind.InvocationExpression: str = parent.Name.ToString(); break; } if (string.IsNullOrEmpty(str) || SemanticFacts.IsSameName(str, "validate")) { firstRecordChangeSyntax.AddIdentifierIfNotExist(identifier); } else { if (VariableInitializationUsageAnalyzer.changingBuildInMethods.Contains(str)) { firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); } if (VariableInitializationUsageAnalyzer.initBuildInMethods.Contains(str)) { firstVarInitializerSyntax.AddIdentifierIfNotExist(identifier); } if (!SemanticFacts.IsSameName("modify", str)) { return; } lastRecordModifyInvocationSyntax.AddLastRecordModifyInvocationSyntax(identifier); } }
private static void CollectInitializedNotUsedNotInitializedUsedGlobalVars( HashSet <IdentifierNameSyntax> syntaxUsedNotInitialized, HashSet <IdentifierNameSyntax> syntaxAssignedNotUsed, Dictionary <string, IdentifierNameSyntax> firstGlobalVarInitializerSyntax, Dictionary <string, IdentifierNameSyntax> firstGlobalVarUsageSyntax, Dictionary <string, VariableDeclarationBaseSyntax> globalVariables) { foreach (string key in globalVariables.Keys) { // ISSUE: variable of a compiler-generated type VariableDeclarationBaseSyntax declarationBaseSyntax; globalVariables.TryGetValue(key, out declarationBaseSyntax); if (!declarationBaseSyntax.Type.IsKind(SyntaxKind.SimpleTypeReference) || declarationBaseSyntax.Type.Array == null || !declarationBaseSyntax.Type.Array.IsKind(SyntaxKind.Array)) { NavTypeKind navTypeKind = NavTypeExtensions.GetNavTypeKind(declarationBaseSyntax.Type.DataType.TypeName.ValueText); if (VariableInitializationUsageAnalyzer.navTypeKinds.Contains(navTypeKind)) { bool flag1 = firstGlobalVarInitializerSyntax.ContainsKey(key); bool flag2 = firstGlobalVarUsageSyntax.ContainsKey(key); if (flag1 && !flag2 && navTypeKind != NavTypeKind.Record) { // ISSUE: variable of a compiler-generated type IdentifierNameSyntax identifierNameSyntax; firstGlobalVarInitializerSyntax.TryGetValue(key, out identifierNameSyntax); syntaxAssignedNotUsed.Add(identifierNameSyntax); } if (flag2 && !flag1 && navTypeKind != NavTypeKind.Boolean && (!declarationBaseSyntax.Type.IsKind(SyntaxKind.RecordTypeReference) || !((RecordTypeReferenceSyntax)declarationBaseSyntax.Type).Temporary.IsKind(SyntaxKind.TemporaryKeyword))) { // ISSUE: variable of a compiler-generated type IdentifierNameSyntax identifierNameSyntax; firstGlobalVarUsageSyntax.TryGetValue(key, out identifierNameSyntax); syntaxUsedNotInitialized.Add(identifierNameSyntax); } } } } }
private void CollectInitializedNotUsedNotInitializedUsedLocalVars( HashSet <IdentifierNameSyntax> syntaxAssignedNotUsed, HashSet <IdentifierNameSyntax> syntaxUsedNotInitialized) { foreach (string key in this.localVariables.Keys) { VariableDeclarationBaseSyntax declarationBaseSyntax; this.localVariables.TryGetValue(key, out declarationBaseSyntax); switch (declarationBaseSyntax.Type.Kind) { case SyntaxKind.SimpleTypeReference: if (declarationBaseSyntax.Type.Array == null || !declarationBaseSyntax.Type.Array.IsKind(SyntaxKind.Array)) { break; } continue; case SyntaxKind.RecordTypeReference: IdentifierNameSyntax identifierNameSyntax1; if (this.lastRecordModifyInvocationSyntax.TryGetValue(key, out identifierNameSyntax1)) { IdentifierNameSyntax identifierNameSyntax2; if (this.firstRecordChangeSyntax.TryGetValue(key, out identifierNameSyntax2)) { continue; } continue; } continue; } NavTypeKind navTypeKind = NavTypeExtensions.GetNavTypeKind(declarationBaseSyntax.Type.DataType.TypeName.ValueText); if (VariableInitializationUsageAnalyzer.navTypeKinds.Contains(navTypeKind)) { bool flag1 = this.firstInitializerSyntax.ContainsKey(key); bool flag2 = this.firstLocalVarUsageSyntax.ContainsKey(key); IdentifierNameSyntax identifierNameSyntax2; if (flag1 && !flag2) { this.firstInitializerSyntax.TryGetValue(key, out identifierNameSyntax2); syntaxAssignedNotUsed.Add(identifierNameSyntax2); } if (navTypeKind != NavTypeKind.Boolean) { IdentifierNameSyntax identifierNameSyntax3; if (flag2 && !flag1) { this.firstLocalVarUsageSyntax.TryGetValue(key, out identifierNameSyntax3); syntaxUsedNotInitialized.Add(identifierNameSyntax3); } if (flag2 & flag1) { this.firstLocalVarUsageSyntax.TryGetValue(key, out identifierNameSyntax3); this.firstInitializerSyntax.TryGetValue(key, out identifierNameSyntax2); FileLinePositionSpan lineSpan; int?nullable1; if (identifierNameSyntax2 == null) { nullable1 = new int?(); } else { lineSpan = identifierNameSyntax2.GetLocation().GetLineSpan(); nullable1 = new int?(lineSpan.StartLinePosition.Line); } int?nullable2 = nullable1; int?nullable3; if (identifierNameSyntax3 == null) { nullable3 = new int?(); } else { lineSpan = identifierNameSyntax3.GetLocation().GetLineSpan(); nullable3 = new int?(lineSpan.StartLinePosition.Line); } int?nullable4 = nullable3; if (nullable2.GetValueOrDefault() > nullable4.GetValueOrDefault() & (nullable2.HasValue & nullable4.HasValue)) { syntaxUsedNotInitialized.Add(identifierNameSyntax3); } } } } } }
public void CollectLocalVariablesUsage(SyntaxNodeAnalysisContext context) { IdentifierNameSyntax identifierNameSyntax = context.GetIdentifierNameSyntax(); if (identifierNameSyntax == null || this.localVariables.Count == 0 || !this.localVariables.ContainsKey(identifierNameSyntax.Identifier.ValueText)) { return; } VariableDeclarationBaseSyntax declarationBaseSyntax; this.localVariables.TryGetValue(identifierNameSyntax.Identifier.ValueText, out declarationBaseSyntax); NavTypeKind navTypeKind = NavTypeExtensions.GetNavTypeKind(declarationBaseSyntax?.Type.DataType.TypeName.ValueText); SyntaxKind kind = identifierNameSyntax.Parent.Kind; if ((uint)kind <= 233U) { switch (kind) { case SyntaxKind.AssignmentStatement: VariableInitializationUsageAnalyzer.AnalyzeAssignmentStatementIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstRecordChangeSyntax, navTypeKind); return; case SyntaxKind.CompoundAssignmentStatement: VariableInitializationUsageAnalyzer.AnalyzeCompoundAssignmentStatementIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax); return; case SyntaxKind.ForStatement: VariableInitializationUsageAnalyzer.AnalyzeForStatementIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax); return; } } else { switch (kind) { case SyntaxKind.ForEachStatement: VariableInitializationUsageAnalyzer.AnalyzeForEachStatementIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax); return; case SyntaxKind.ArrayIndexExpression: if (navTypeKind != NavTypeKind.Code && navTypeKind != NavTypeKind.Text) { return; } VariableInitializationUsageAnalyzer.AnalyzeArrayIndexExpressionIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax); return; case SyntaxKind.MemberAccessExpression: if (navTypeKind != NavTypeKind.List && navTypeKind != NavTypeKind.Record) { return; } VariableInitializationUsageAnalyzer.AnalyzeMemberAccessIdentifier(identifierNameSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax, (Dictionary <string, IdentifierNameSyntax>) this.lastRecordModifyInvocationSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstRecordChangeSyntax, navTypeKind); return; case SyntaxKind.OptionAccessExpression: return; case SyntaxKind.ArgumentList: VariableInitializationUsageAnalyzer.AnalyzeArgumentListIdentifier(identifierNameSyntax, context, (Dictionary <string, IdentifierNameSyntax>) this.firstInitializerSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstLocalVarUsageSyntax, (Dictionary <string, IdentifierNameSyntax>) this.firstRecordChangeSyntax, navTypeKind); return; } } this.firstLocalVarUsageSyntax.AddIdentifierIfNotExist(identifierNameSyntax); }
private static void AnalyzeGlobalVarUsage( IdentifierNameSyntax identifier, Dictionary <string, IdentifierNameSyntax> firstGlobalVarUsageSyntax, Dictionary <string, IdentifierNameSyntax> firstGlobalVarInitializerSyntax, Dictionary <string, IdentifierNameSyntax> lastRecordModifyInvocationSyntax, Dictionary <string, IdentifierNameSyntax> firstRecordChangeSyntax, SyntaxNodeAnalysisContext syntaxNodeAnalysisContext, Dictionary <string, VariableDeclarationBaseSyntax> globalVariables) { if (IdentifierUtilities.IdentifierIsLocalVariable(identifier)) { return; } SyntaxKind kind = identifier.Parent.Kind; switch (kind) { case SyntaxKind.PageField: case SyntaxKind.ReportColumn: firstGlobalVarInitializerSyntax.AddIdentifierIfNotExist(identifier); firstGlobalVarUsageSyntax.AddIdentifierIfNotExist(identifier); break; default: if (globalVariables.Count == 0 || !globalVariables.ContainsKey(identifier.Identifier.ValueText)) { break; } // ISSUE: variable of a compiler-generated type VariableDeclarationBaseSyntax declarationBaseSyntax; globalVariables.TryGetValue(identifier.Identifier.ValueText, out declarationBaseSyntax); NavTypeKind navTypeKind = NavTypeExtensions.GetNavTypeKind(declarationBaseSyntax?.Type.DataType.TypeName.ValueText); if ((uint)kind <= 233U) { switch (kind) { case SyntaxKind.AssignmentStatement: VariableInitializationUsageAnalyzer.AnalyzeAssignmentStatementIdentifier(identifier, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax, firstRecordChangeSyntax, navTypeKind); return; case SyntaxKind.CompoundAssignmentStatement: if (navTypeKind == NavTypeKind.Record) { return; } VariableInitializationUsageAnalyzer.AnalyzeCompoundAssignmentStatementIdentifier(identifier, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax); return; case SyntaxKind.ForStatement: if (navTypeKind == NavTypeKind.Record) { return; } VariableInitializationUsageAnalyzer.AnalyzeForStatementIdentifier(identifier, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax); return; } } else if ((uint)kind <= 262U) { switch (kind) { case SyntaxKind.ForEachStatement: if (navTypeKind == NavTypeKind.Record) { return; } VariableInitializationUsageAnalyzer.AnalyzeForEachStatementIdentifier(identifier, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax); return; case SyntaxKind.ArrayIndexExpression: if (navTypeKind != NavTypeKind.Code && navTypeKind != NavTypeKind.Text) { return; } VariableInitializationUsageAnalyzer.AnalyzeArrayIndexExpressionIdentifier(identifier, firstGlobalVarInitializerSyntax); return; } } else if (kind != SyntaxKind.MemberAccessExpression) { if (kind == SyntaxKind.ArgumentList) { VariableInitializationUsageAnalyzer.AnalyzeArgumentListIdentifier(identifier, syntaxNodeAnalysisContext, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax, firstRecordChangeSyntax, navTypeKind); break; } } else { VariableInitializationUsageAnalyzer.AnalyzeMemberAccessIdentifier(identifier, firstGlobalVarInitializerSyntax, firstGlobalVarUsageSyntax, lastRecordModifyInvocationSyntax, firstRecordChangeSyntax, navTypeKind); break; } if (navTypeKind == NavTypeKind.Record) { break; } firstGlobalVarUsageSyntax.AddIdentifierIfNotExist(identifier); break; } }
private static void AnalyzeArgumentListIdentifier( IdentifierNameSyntax identifier, SyntaxNodeAnalysisContext context, Dictionary <string, IdentifierNameSyntax> firstVarInitializerSyntax, Dictionary <string, IdentifierNameSyntax> firstVarUsageSyntax, Dictionary <string, IdentifierNameSyntax> firstRecordChangeSyntax, NavTypeKind variableNavTypeKind) { // ISSUE: variable of a compiler-generated type ArgumentListSyntax parent = (ArgumentListSyntax)identifier.Parent; if (!parent.Parent.IsKind(SyntaxKind.InvocationExpression)) { return; } if (((InvocationExpressionSyntax)parent.Parent).Expression.IsKind(SyntaxKind.IdentifierName) && SemanticFacts.IsSameName(((SimpleNameSyntax)((InvocationExpressionSyntax)parent.Parent).Expression).Identifier.ValueText, "evaluate")) { SeparatedSyntaxList <CodeExpressionSyntax> arguments = parent.Arguments; if (arguments[0].IsKind(SyntaxKind.IdentifierName)) { arguments = parent.Arguments; SyntaxToken identifier1 = ((SimpleNameSyntax)arguments[0]).Identifier; string valueText1 = identifier1.ValueText; identifier1 = identifier.Identifier; string valueText2 = identifier1.ValueText; if (SemanticFacts.IsSameName(valueText1, valueText2)) { firstVarInitializerSyntax.AddIdentifierIfNotExist(identifier); SyntaxKind?kind = identifier.Parent?.Parent?.Parent?.Kind; if (!kind.HasValue) { return; } SyntaxKind valueOrDefault = kind.GetValueOrDefault(); if ((uint)valueOrDefault <= 235U) { if (valueOrDefault != SyntaxKind.IfStatement && valueOrDefault != SyntaxKind.ExitStatement) { return; } } else { switch (valueOrDefault) { case SyntaxKind.LogicalOrExpression: case SyntaxKind.LogicalAndExpression: case SyntaxKind.LogicalXorExpression: case SyntaxKind.UnaryNotExpression: break; default: return; } } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); return; } } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); } else { IInvocationExpression operation = (IInvocationExpression)context.SemanticModel.GetOperation(parent.Parent); if (operation == null) { if (parent.Arguments.Count == 0) { return; } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); } else { if (operation.TargetMethod.MethodKind == MethodKind.BuiltInMethod && SemanticFacts.IsSameName(operation.TargetMethod.Name, "settable")) { firstRecordChangeSyntax.AddIdentifierIfNotExist(identifier); } foreach (IArgument obj in operation.Arguments) { if (obj.Value.Syntax == identifier) { if (obj.Parameter != null) { if (obj.Parameter.IsVar) { firstVarInitializerSyntax.AddIdentifierIfNotExist(identifier); if (variableNavTypeKind == NavTypeKind.Record) { firstRecordChangeSyntax.AddIdentifierIfNotExist(identifier); break; } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); break; } if (obj.Parameter.IsMemberReference) { break; } } if (variableNavTypeKind == NavTypeKind.Record) { break; } firstVarUsageSyntax.AddIdentifierIfNotExist(identifier); break; } } } } }