private static void AddVariableToGlobalVarList( Dictionary <string, VariableDeclarationBaseSyntax> globalVariables, VariableDeclarationBaseSyntax variable) { if (!VariableInitializationUsageAnalyzer.navTypeKinds.Contains(NavTypeExtensions.GetNavTypeKind(variable.Type.DataType.TypeName.ValueText)) && variable.Type.Array != null) { return; } if (variable.IsKind(SyntaxKind.VariableListDeclaration)) { foreach (VariableDeclarationNameSyntax variableName in ((VariableListDeclarationSyntax)variable).VariableNames) { globalVariables.Add(variableName.GetNameStringValue(), variable); } } else { globalVariables.Add(variable.GetNameStringValue(), variable); } }
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; } }