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;
            }
        }