コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
 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);
                 }
             }
         }
     }
 }
コード例 #4
0
            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);
                                }
                            }
                        }
                    }
                }
            }
コード例 #5
0
            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);
            }
コード例 #6
0
        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;
            }
        }
コード例 #7
0
        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;
                        }
                    }
                }
            }
        }