コード例 #1
0
 public IConversionExpressionWithValue Convert(IConversionExpression expression)
 {
     if (expression is ImperialLengthExpression)
     {
         var tempExpression = (ImperialLengthExpression)expression;
         return(new MetricLengthExpression {
             Value = tempExpression.Value * (decimal)0.3048
         });
     }
     else if (expression is ImperialAreaExpression)
     {
         var tempExpression = (ImperialAreaExpression)expression;
         return(new MetricAreaExpression {
             Value = tempExpression.Value * (decimal)0.0929
         });
     }
     else if (expression is ImperialMassExpression)
     {
         var tempExpression = (ImperialMassExpression)expression;
         return(new MetricMassExpression {
             Value = tempExpression.Value * (decimal)453.59237
         });
     }
     else if (expression is ImperialVolumeExpression)
     {
         var tempExpression = (ImperialVolumeExpression)expression;
         return(new MetricVolumeExpression {
             Value = tempExpression.Value * (decimal)0.0284130625
         });
     }
     else
     {
         throw new InvalidExpressionException();
     }
 }
コード例 #2
0
ファイル: CsToLua_Object.cs プロジェクト: hexiaoweiff8/Cs2Lua
        public override void VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node)
        {
            SymbolInfo symInfo = m_Model.GetSymbolInfo(node);
            var        sym     = symInfo.Symbol as IMethodSymbol;

            if (null != sym && sym.Parameters.Length == 1)
            {
                var param = sym.Parameters[0];
                CodeBuilder.AppendFormat("(function({0}) return ", param.Name);
                IConversionExpression opd = null;
                var oper = m_Model.GetOperation(node) as ILambdaExpression;
                if (null != oper && oper.Body.Statements.Length == 1)
                {
                    var iret = oper.Body.Statements[0] as IReturnStatement;
                    if (null != iret)
                    {
                        opd = iret.ReturnedValue as IConversionExpression;
                    }
                }
                var exp = node.Body as ExpressionSyntax;
                OutputExpressionSyntax(exp, opd);
                CodeBuilder.Append("; end)");
            }
            else
            {
                ReportIllegalSymbol(node, symInfo);
            }
        }
コード例 #3
0
        public override void VisitConversionExpression(IConversionExpression operation)
        {
            var usesOperatorMethod = operation.UsesOperatorMethod;
            var operatorMethod     = operation.OperatorMethod;
            var conversion         = operation.Conversion;
            var isExplicitInCode   = operation.IsExplicitInCode;
            var isChecked          = operation.IsChecked;
            var isTryCast          = operation.IsTryCast;

            switch (operation.Language)
            {
            case LanguageNames.CSharp:
                CSharp.Conversion csharpConversion = CSharp.CSharpExtensions.GetConversion(operation);
                break;

            case LanguageNames.VisualBasic:
                VisualBasic.Conversion visualBasicConversion = VisualBasic.VisualBasicExtensions.GetConversion(operation);
                break;

            default:
                Debug.Fail($"Language {operation.Language} is unknown!");
                break;
            }

            base.VisitConversionExpression(operation);
        }
コード例 #4
0
        public sealed override void Initialize(AnalysisContext context)
        {
            context.RegisterOperationAction(
                (operationContext) =>
            {
                IOperation operation = operationContext.Operation;

                if (operation.Kind == OperationKind.ConversionExpression)
                {
                    IConversionExpression conversion = (IConversionExpression)operation;
                    if (conversion.Type.IsReferenceType &&
                        conversion.Operand.Type != null &&
                        conversion.Operand.Type.IsValueType &&
                        conversion.OperatorMethod == null)
                    {
                        Report(operationContext, conversion.Syntax);
                    }
                }

                // Calls to instance methods of value types don’t have conversions.
                if (operation.Kind == OperationKind.InvocationExpression)
                {
                    IInvocationExpression invocation = (IInvocationExpression)operation;

                    if (invocation.Instance != null &&
                        invocation.Instance.Type.IsValueType &&
                        invocation.TargetMethod.ContainingType.IsReferenceType)
                    {
                        Report(operationContext, invocation.Instance.Syntax);
                    }
                }
            },
                OperationKind.ConversionExpression,
                OperationKind.InvocationExpression);
        }
コード例 #5
0
            private void AnalyzeXmlResolverPropertyAssignmentForXmlDocument(OperationAnalysisContext context, ISymbol assignedSymbol, IAssignmentExpression expression)
            {
                bool isSecureResolver      = false;
                IConversionExpression conv = expression.Value as IConversionExpression;

                if (SecurityDiagnosticHelpers.IsXmlSecureResolverType(conv.Operand.Type, _xmlTypes))
                {
                    isSecureResolver = true;
                }
                else if (conv != null && SecurityDiagnosticHelpers.IsExpressionEqualsNull(conv.Operand))
                {
                    isSecureResolver = true;
                }
                else // Assigning XmlDocument's XmlResolver to an insecure value
                {
                    Diagnostic diag = Diagnostic.Create(
                        RuleDoNotUseInsecureDtdProcessing,
                        context.Operation.Syntax.GetLocation(),
                        SecurityDiagnosticHelpers.GetLocalizableResourceString(
                            nameof(DesktopAnalyzersResources.XmlDocumentWithNoSecureResolverMessage)
                            )
                        );
                    context.ReportDiagnostic(diag);
                }

                if (_xmlDocumentEnvironments.ContainsKey(assignedSymbol))
                {
                    XmlDocumentEnvironment xmlDocumentEnv = _xmlDocumentEnvironments[assignedSymbol];
                    xmlDocumentEnv.IsXmlResolverSet = true;
                    xmlDocumentEnv.IsSecureResolver = isSecureResolver;
                }
            }
コード例 #6
0
        public override void VisitForStatement(ForStatementSyntax node)
        {
            ContinueInfo ci = new ContinueInfo();

            ci.Init(node.Statement);
            m_ContinueInfoStack.Push(ci);

            if (null != node.Declaration)
            {
                VisitVariableDeclaration(node.Declaration);
            }
            CodeBuilder.AppendFormat("{0}while ", GetIndentString());
            if (null != node.Condition)
            {
                var oper = m_Model.GetOperation(node) as IForLoopStatement;
                IConversionExpression opd = null;
                if (null != oper)
                {
                    opd = oper.Condition as IConversionExpression;
                }
                OutputExpressionSyntax(node.Condition, opd);
            }
            else
            {
                CodeBuilder.AppendLine("true");
            }
            CodeBuilder.AppendLine(" do");
            if (ci.HaveContinue)
            {
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}local {1} = false", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
                CodeBuilder.AppendFormat("{0}repeat", GetIndentString());
                CodeBuilder.AppendLine();
            }
            ++m_Indent;
            node.Statement.Accept(this);
            --m_Indent;
            if (ci.HaveContinue)
            {
                CodeBuilder.AppendFormat("{0}until true;", GetIndentString());
                CodeBuilder.AppendLine();
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}if {1} then break; end;", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
            }
            foreach (var exp in node.Incrementors)
            {
                CodeBuilder.AppendFormat("{0}", GetIndentString());
                VisitToplevelExpression(exp, ";");
            }
            CodeBuilder.AppendFormat("{0}end;", GetIndentString());
            CodeBuilder.AppendLine();

            m_ContinueInfoStack.Pop();
        }
コード例 #7
0
        public override void VisitIfStatement(IfStatementSyntax node)
        {
            CodeBuilder.AppendFormat("{0}if ", GetIndentString());
            var oper = m_Model.GetOperation(node) as IIfStatement;
            IConversionExpression opd = null;

            if (null != oper)
            {
                opd = oper.Condition as IConversionExpression;
            }
            OutputExpressionSyntax(node.Condition, opd);
            CodeBuilder.AppendLine(" then");
            ++m_Indent;
            node.Statement.Accept(this);
            --m_Indent;
            if (null != node.Else)
            {
                VisitElseClause(node.Else);
            }
            else
            {
                CodeBuilder.AppendFormat("{0}end;", GetIndentString());
                CodeBuilder.AppendLine();
            }
        }
コード例 #8
0
 public IConversionExpressionWithValue Convert(IConversionExpression expression)
 {
     if (expression is MetricLengthExpression)
     {
         var tempExpression = (MetricLengthExpression)expression;
         return(new ImperialLengthExpression {
             Value = tempExpression.Value * (decimal)3.280839895
         });
     }
     else if (expression is MetricAreaExpression)
     {
         var tempExpression = (MetricAreaExpression)expression;
         return(new ImperialAreaExpression {
             Value = tempExpression.Value * (decimal)10.76391041671
         });
     }
     else if (expression is MetricMassExpression)
     {
         var tempExpression = (MetricMassExpression)expression;
         return(new ImperialMassExpression {
             Value = tempExpression.Value * (decimal)0.00220462262185
         });
     }
     else if (expression is MetricVolumeExpression)
     {
         var tempExpression = (MetricVolumeExpression)expression;
         return(new ImperialVolumeExpression {
             Value = tempExpression.Value * (decimal)33.8140226
         });
     }
     else
     {
         throw new InvalidExpressionException();
     }
 }
コード例 #9
0
        public override void VisitCatchClause(CatchClauseSyntax node)
        {
            MethodInfo mi = m_MethodInfoStack.Peek();

            mi.TryCatchUsingOrLoopSwitchStack.Push(true);
            ReturnContinueBreakAnalysis returnAnalysis = mi.TempReturnAnalysisStack.Peek();

            string handledVar = string.Format("__catch_handled_{0}", GetSourcePosForVar(node));
            string bodyVar    = string.Format("__catch_body_{0}", GetSourcePosForVar(node));

            CodeBuilder.AppendFormat("{0}(function({1}", GetIndentString(), handledVar);
            if (null != node.Declaration)
            {
                CodeBuilder.Append(", ");
                CodeBuilder.Append(node.Declaration.Identifier.Text);
            }
            CodeBuilder.Append("){");
            CodeBuilder.AppendLine();
            ++m_Indent;
            if (null != node.Filter)
            {
                CodeBuilder.Append("if(");
                IConversionExpression opd = m_Model.GetOperation(node.Filter.FilterExpression) as IConversionExpression;
                OutputExpressionSyntax(node.Filter.FilterExpression, opd);
                CodeBuilder.Append("){");
                CodeBuilder.AppendLine();
                ++m_Indent;
            }
            CodeBuilder.AppendFormat("{0}{1} = true;", GetIndentString(), handledVar);
            CodeBuilder.AppendLine();
            if (null != node.Filter)
            {
                --m_Indent;
                CodeBuilder.AppendFormat("{0}}};", GetIndentString());
                CodeBuilder.AppendLine();
            }
            if (returnAnalysis.Exist)
            {
                CodeBuilder.AppendFormat("{0}local({1}); {1} = function(){{", GetIndentString(), bodyVar);
                CodeBuilder.AppendLine();
                ++m_Indent;
                VisitBlock(node.Block);
                --m_Indent;
                CodeBuilder.AppendFormat("{0}}};", GetIndentString());
                CodeBuilder.AppendLine();
                CodeBuilder.AppendFormat("{0}return({1}, {2}());", GetIndentString(), handledVar, bodyVar);
                CodeBuilder.AppendLine();
            }
            else
            {
                VisitBlock(node.Block);
                CodeBuilder.AppendFormat("{0}return({1}, null);", GetIndentString(), handledVar);
                CodeBuilder.AppendLine();
            }
            --m_Indent;
            CodeBuilder.AppendFormat("{0}}})", GetIndentString());
            CodeBuilder.AppendLine();

            mi.TryCatchUsingOrLoopSwitchStack.Pop();
        }
コード例 #10
0
        public override void VisitThrowStatement(ThrowStatementSyntax node)
        {
            CodeBuilder.AppendFormat("{0}luathrow(", GetIndentString());
            IConversionExpression opd = m_Model.GetOperation(node.Expression) as IConversionExpression;

            OutputExpressionSyntax(node.Expression, opd);
            CodeBuilder.AppendLine(");");
        }
コード例 #11
0
 /// <inheritdoc />
 public override Expression VisitConversionExpression(IConversionExpression operation, LocalBinder argument)
 {
     return(Expression.Convert(
                operation.Operand.Accept(this, argument),
                operation.Type.GetCorrespondingType(),
                operation.OperatorMethod?.GetCorrespondingMethod() as MethodInfo
                ));
 }
コード例 #12
0
 public IConversionExpression BuildFrom(IEnumerable <IConversionToken> tokens)
 {
     foreach (var conversionToken in tokens)
     {
         conversionToken.Accept(this);
     }
     mResult = mCurrent;
     return(mResult);
 }
コード例 #13
0
        public override void VisitConversionExpression(IConversionExpression operation)
        {
            var usesOperatorMethod = operation.UsesOperatorMethod;
            var operatorMethod     = operation.OperatorMethod;
            var converisionKind    = operation.ConversionKind;
            var isExplicit         = operation.IsExplicit;

            base.VisitConversionExpression(operation);
        }
コード例 #14
0
        public override void VisitReturnStatement(ReturnStatementSyntax node)
        {
            MethodInfo mi = m_MethodInfoStack.Peek();

            mi.ExistTopLevelReturn = IsLastNodeOfMethod(node);

            bool isLastNode = IsLastNodeOfParent(node);

            if (!isLastNode)
            {
                CodeBuilder.AppendFormat("{0}do", GetIndentString());
                CodeBuilder.AppendLine();
            }

            string prestr;

            if (mi.SemanticInfo.MethodKind == MethodKind.Constructor)
            {
                CodeBuilder.AppendFormat("{0}return this", GetIndentString());
                prestr = ", ";
            }
            else
            {
                CodeBuilder.AppendFormat("{0}return ", GetIndentString());
                prestr = string.Empty;
            }
            if (null != node.Expression)
            {
                CodeBuilder.Append(prestr);
                IConversionExpression opd = null;
                var iret = m_Model.GetOperation(node) as IReturnStatement;
                if (null != iret)
                {
                    opd = iret.ReturnedValue as IConversionExpression;
                }
                OutputExpressionSyntax(node.Expression, opd);
                prestr = ", ";
            }
            var names = mi.ReturnParamNames;

            if (names.Count > 0)
            {
                for (int i = 0; i < names.Count; ++i)
                {
                    CodeBuilder.Append(prestr);
                    CodeBuilder.Append(names[i]);
                    prestr = ", ";
                }
            }
            CodeBuilder.AppendLine(";");

            if (!isLastNode)
            {
                CodeBuilder.AppendFormat("{0}end;", GetIndentString());
                CodeBuilder.AppendLine();
            }
        }
コード例 #15
0
 public void Visit(MetricVolumeToken metricVolumeToken)
 {
     mCurrent = new MetricVolumeExpression {
         Value = metricVolumeToken.Value
     };
     if (mCurrentOperation != null)
     {
         FillOperation();
     }
 }
コード例 #16
0
 public void Visit(ImperialVolumeToken imperialVolumeToken)
 {
     mCurrent = new ImperialVolumeExpression {
         Value = imperialVolumeToken.Value
     };
     if (mCurrentOperation != null)
     {
         FillOperation();
     }
 }
コード例 #17
0
        void MakeReplacementWithDoubleConversion <TSelf>(IArithmeticConversionOperation operation,
                                                         IConversionExpression lhs, IConversionExpression rhs) where TSelf : IConversionExpressionWithValue, new()
        {
            var templhs = (TSelf)ConvertSingleExpression(rhs);
            var temprhs = (TSelf)ConvertSingleExpression(lhs);

            mReplacement = new TSelf
            {
                Value = CalculateValueForSpecificOperationType(operation, templhs.Value, temprhs.Value)
            };
        }
コード例 #18
0
 public IConversionExpressionWithValue Convert(IConversionExpression expression, bool toMetric)
 {
     mToMetric  = toMetric;
     mConverter = mConverterFactory(toMetric);
     if (!CheckIfVisitorIsNecessary(expression))
     {
         return(ConvertSingleExpression(expression));
     }
     expression.Accept(this);
     return(mResult);
 }
コード例 #19
0
ファイル: CsToLua_Misc.cs プロジェクト: winslylord/Cs2Lua
        public override void VisitArgument(ArgumentSyntax node)
        {
            var oper = m_Model.GetOperation(node) as IArgument;
            IConversionExpression opd = null;

            if (null != oper)
            {
                opd = oper.Value as IConversionExpression;
            }
            OutputExpressionSyntax(node.Expression, opd);
        }
コード例 #20
0
ファイル: CsToLua_Object.cs プロジェクト: zhouwensi/Cs2Lua
        public override void VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node)
        {
            SymbolInfo symInfo = m_Model.GetSymbolInfo(node);
            var        sym     = symInfo.Symbol as IMethodSymbol;

            if (null != sym && sym.Parameters.Length == 1)
            {
                if (node.Body is BlockSyntax)
                {
                    var param = sym.Parameters[0];
                    CodeBuilder.AppendFormat("(function({0})", param.Name);
                    CodeBuilder.AppendLine();
                    ++m_Indent;
                    node.Body.Accept(this);
                    if (!sym.ReturnsVoid)
                    {
                        CodeBuilder.AppendFormat("{0}return {1};", GetIndentString(), param.Name);
                        CodeBuilder.AppendLine();
                    }
                    --m_Indent;
                    CodeBuilder.AppendFormat("{0}end)", GetIndentString());
                }
                else
                {
                    var param = sym.Parameters[0];
                    CodeBuilder.AppendFormat("(function({0}) return ", param.Name);
                    IConversionExpression opd = null;
                    var oper = m_Model.GetOperation(node) as ILambdaExpression;
                    if (null != oper && oper.Body.Statements.Length == 1)
                    {
                        var iret = oper.Body.Statements[0] as IReturnStatement;
                        if (null != iret)
                        {
                            opd = iret.ReturnedValue as IConversionExpression;
                        }
                    }
                    var exp = node.Body as ExpressionSyntax;
                    if (null != exp)
                    {
                        OutputExpressionSyntax(exp, opd);
                    }
                    else
                    {
                        ReportIllegalSymbol(node, symInfo);
                    }
                    CodeBuilder.Append("; end)");
                }
            }
            else
            {
                ReportIllegalSymbol(node, symInfo);
            }
        }
コード例 #21
0
 void FillOperation()
 {
     if (mCurrentOperation.Left == null)
     {
         mCurrentOperation.Left = mCurrent;
     }
     else
     {
         mCurrentOperation.Right = mCurrent;
     }
     mCurrent = mCurrentOperation;
 }
コード例 #22
0
        private static ITypeSymbol OriginalType(IOperation value)
        {
            if (value.Kind == OperationKind.ConversionExpression)
            {
                IConversionExpression conversion = (IConversionExpression)value;
                if (!conversion.IsExplicit)
                {
                    return(conversion.Operand.Type);
                }
            }

            return(value.Type);
        }
コード例 #23
0
        public override void VisitForEachStatement(ForEachStatementSyntax node)
        {
            ContinueInfo ci = new ContinueInfo();

            ci.Init(node.Statement);
            m_ContinueInfoStack.Push(ci);

            string varName = string.Format("__compiler_foreach_{0}", node.GetLocation().GetLineSpan().StartLinePosition.Line);

            CodeBuilder.AppendFormat("{0}local {1} = (", GetIndentString(), varName);
            IConversionExpression opd = null;
            var oper = m_Model.GetOperation(node) as IForEachLoopStatement;

            if (null != oper)
            {
                opd = oper.Collection as IConversionExpression;
            }
            OutputExpressionSyntax(node.Expression, opd);
            CodeBuilder.AppendLine("):GetEnumerator();");
            CodeBuilder.AppendFormat("{0}while {1}:MoveNext() do", GetIndentString(), varName);
            CodeBuilder.AppendLine();
            if (ci.HaveContinue)
            {
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}local {1} = false", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
                CodeBuilder.AppendFormat("{0}repeat", GetIndentString());
                CodeBuilder.AppendLine();
            }
            ++m_Indent;
            CodeBuilder.AppendFormat("{0}{1} = {2}.Current;", GetIndentString(), node.Identifier.Text, varName);
            CodeBuilder.AppendLine();
            node.Statement.Accept(this);
            --m_Indent;
            if (ci.HaveContinue)
            {
                CodeBuilder.AppendFormat("{0}until true;", GetIndentString());
                CodeBuilder.AppendLine();
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}if {1} then break; end;", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
            }
            CodeBuilder.AppendFormat("{0}end;", GetIndentString());
            CodeBuilder.AppendLine();

            m_ContinueInfoStack.Pop();
        }
コード例 #24
0
        public override void VisitConversionExpression(IConversionExpression operation)
        {
            LogString(nameof(IConversionExpression));

            var kindStr       = $"{nameof(ConversionKind)}.{operation.ConversionKind}";
            var isExplicitStr = operation.IsExplicit ? "Explicit" : "Implicit";

            LogString($" ({kindStr}, {isExplicitStr})");

            LogHasOperatorMethodExpressionCommon(operation);
            LogCommonPropertiesAndNewLine(operation);

            base.VisitConversionExpression(operation);
        }
コード例 #25
0
ファイル: CsToDsl_Statement.cs プロジェクト: modi0012/Cs2Lua
        public override void VisitDoStatement(DoStatementSyntax node)
        {
            MethodInfo mi = m_MethodInfoStack.Peek();

            mi.TryCatchUsingOrLoopSwitchStack.Push(false);

            ContinueInfo ci = new ContinueInfo();

            ci.Init(node.Statement);
            m_ContinueInfoStack.Push(ci);

            CodeBuilder.AppendFormat("{0}do{{", GetIndentString());
            CodeBuilder.AppendLine();
            if (ci.HaveContinue)
            {
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}local({1}); {1} = false;", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
                CodeBuilder.AppendFormat("{0}do{{", GetIndentString());
                CodeBuilder.AppendLine();
            }
            ++m_Indent;
            node.Statement.Accept(this);
            --m_Indent;
            if (ci.HaveContinue)
            {
                CodeBuilder.AppendFormat("{0}}}while(false);", GetIndentString());
                CodeBuilder.AppendLine();
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}if({1}){{break;}};", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
            }
            CodeBuilder.AppendFormat("{0}}}while(", GetIndentString());
            var oper = m_Model.GetOperationEx(node) as IWhileUntilLoopStatement;
            IConversionExpression opd = null;

            if (null != oper)
            {
                opd = oper.Condition as IConversionExpression;
            }
            OutputExpressionSyntax(node.Condition, opd);
            CodeBuilder.AppendLine(");");

            m_ContinueInfoStack.Pop();
            mi.TryCatchUsingOrLoopSwitchStack.Pop();
        }
コード例 #26
0
            private void AnalyzeObjectCreationForXmlReaderSettings(ISymbol variable, IObjectCreationExpression objCreation)
            {
                XmlReaderSettingsEnvironment xmlReaderSettingsEnv = new XmlReaderSettingsEnvironment(_isFrameworkSecure);

                if (variable != null)
                {
                    _xmlReaderSettingsEnvironments[variable] = xmlReaderSettingsEnv;
                }

                xmlReaderSettingsEnv.XmlReaderSettingsDefinition = objCreation.Syntax;
                foreach (ISymbolInitializer init in objCreation.MemberInitializers)
                {
                    var prop = init as IPropertyInitializer;

                    if (prop != null)
                    {
                        if (SecurityDiagnosticHelpers.IsXmlReaderSettingsXmlResolverProperty(
                                prop.InitializedProperty,
                                _xmlTypes)
                            )
                        {
                            IConversionExpression operation = prop.Value as IConversionExpression;

                            if (operation == null)
                            {
                                return;
                            }

                            if (SecurityDiagnosticHelpers.IsXmlSecureResolverType(operation.Operand.Type, _xmlTypes))
                            {
                                xmlReaderSettingsEnv.IsSecureResolver = true;
                            }
                            else if (SecurityDiagnosticHelpers.IsExpressionEqualsNull(operation.Operand))
                            {
                                xmlReaderSettingsEnv.IsSecureResolver = true;
                            }
                        }
                        else if (SecurityDiagnosticHelpers.IsXmlReaderSettingsDtdProcessingProperty(prop.InitializedProperty, _xmlTypes))
                        {
                            xmlReaderSettingsEnv.IsDtdProcessingDisabled = !SecurityDiagnosticHelpers.IsExpressionEqualsDtdProcessingParse(prop.Value);
                        }
                        else if (SecurityDiagnosticHelpers.IsXmlReaderSettingsMaxCharactersFromEntitiesProperty(prop.InitializedProperty, _xmlTypes))
                        {
                            xmlReaderSettingsEnv.IsMaxCharactersFromEntitiesLimited = !SecurityDiagnosticHelpers.IsExpressionEqualsIntZero(prop.Value);
                        }
                    }
                }
            }
コード例 #27
0
 public override void ReplaceChild(IConversionExpression oldChild, IConversionExpression newChild)
 {
     if (ReferenceEquals(oldChild, mLeft))
     {
         oldChild.Parent(null);
         Left = newChild;
     }
     else if (ReferenceEquals(oldChild, mRight))
     {
         oldChild.Parent(null);
         Right = newChild;
     }
     else
     {
         throw new ArgumentException();
     }
 }
コード例 #28
0
        public override void VisitDoStatement(DoStatementSyntax node)
        {
            ContinueInfo ci = new ContinueInfo();

            ci.Init(node.Statement);
            m_ContinueInfoStack.Push(ci);

            CodeBuilder.AppendFormat("{0}repeat", GetIndentString());
            CodeBuilder.AppendLine();
            if (ci.HaveContinue)
            {
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}local {1} = false", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
                CodeBuilder.AppendFormat("{0}repeat", GetIndentString());
                CodeBuilder.AppendLine();
            }
            ++m_Indent;
            node.Statement.Accept(this);
            --m_Indent;
            if (ci.HaveContinue)
            {
                CodeBuilder.AppendFormat("{0}until true;", GetIndentString());
                CodeBuilder.AppendLine();
                if (ci.HaveBreak)
                {
                    CodeBuilder.AppendFormat("{0}if {1} then break; end;", GetIndentString(), ci.BreakFlagVarName);
                    CodeBuilder.AppendLine();
                }
            }
            CodeBuilder.AppendFormat("{0}until not (", GetIndentString());
            var oper = m_Model.GetOperation(node) as IWhileUntilLoopStatement;
            IConversionExpression opd = null;

            if (null != oper)
            {
                opd = oper.Condition as IConversionExpression;
            }
            OutputExpressionSyntax(node.Condition, opd);
            CodeBuilder.AppendLine(");");

            m_ContinueInfoStack.Pop();
        }
コード例 #29
0
ファイル: CsToLua_Object.cs プロジェクト: zhouwensi/Cs2Lua
        public override void VisitUsingStatement(UsingStatementSyntax node)
        {
            string varName = string.Format("__compiler_using_{0}", GetSourcePosForVar(node));

            if (null != node.Declaration)
            {
                VisitVariableDeclaration(node.Declaration);
            }
            else if (null != node.Expression)
            {
                CodeBuilder.AppendFormat("{0}local {1} = ", GetIndentString(), varName);
                IConversionExpression opd = m_Model.GetOperation(node.Expression) as IConversionExpression;
                OutputExpressionSyntax(node.Expression, opd);
                CodeBuilder.AppendLine(";");
            }
            else
            {
                Log(node, "node.Declaration and node.Expression are null.");
            }
            if (null != node.Statement)
            {
                node.Statement.Accept(this);
            }
            else
            {
                Log(node, "node.Statement is null.");
            }
            if (null != node.Declaration && null != node.Declaration.Variables)
            {
                foreach (var decl in node.Declaration.Variables)
                {
                    CodeBuilder.AppendFormat("{0}{1}:Dispose();", GetIndentString(), decl.Identifier.Text);
                    CodeBuilder.AppendLine();
                }
            }
            else if (null != node.Expression)
            {
                CodeBuilder.AppendFormat("{0}{1}:Dispose();", GetIndentString(), varName);
                CodeBuilder.AppendLine();
            }
            else
            {
                Log(node, "node.Declaration is null or node.Declaration.Variables is null, and node.Expression is null.");
            }
        }
コード例 #30
0
            private void AnalyzeXmlTextReaderProperties(OperationAnalysisContext context, ISymbol assignedSymbol, IAssignmentExpression expression, bool isXmlTextReaderXmlResolverProperty, bool isXmlTextReaderDtdProcessingProperty)
            {
                XmlTextReaderEnvironment env;

                if (!_xmlTextReaderEnvironments.TryGetValue(assignedSymbol, out env))
                {
                    env = new XmlTextReaderEnvironment(_isFrameworkSecure);
                }

                if (isXmlTextReaderXmlResolverProperty)
                {
                    env.IsXmlResolverSet = true;
                }
                else
                {
                    env.IsDtdProcessingSet = true;
                }

                IConversionExpression conv = expression.Value as IConversionExpression;

                if (isXmlTextReaderXmlResolverProperty && conv != null && SecurityDiagnosticHelpers.IsXmlSecureResolverType(conv.Operand.Type, _xmlTypes))
                {
                    env.IsSecureResolver = true;
                }
                else if (isXmlTextReaderXmlResolverProperty && conv != null && SecurityDiagnosticHelpers.IsExpressionEqualsNull(conv.Operand))
                {
                    env.IsSecureResolver = true;
                }
                else if (isXmlTextReaderDtdProcessingProperty && conv == null && !SecurityDiagnosticHelpers.IsExpressionEqualsDtdProcessingParse(expression.Value))
                {
                    env.IsDtdProcessingDisabled = !SecurityDiagnosticHelpers.IsExpressionEqualsDtdProcessingParse(expression.Value);
                }
                else
                {
                    // Generate a warning whenever the XmlResolver or DtdProcessing property is set to an insecure value
                    Diagnostic diag = Diagnostic.Create(
                        RuleDoNotUseInsecureDtdProcessing,
                        expression.Syntax.GetLocation(),
                        SecurityDiagnosticHelpers.GetLocalizableResourceString(
                            nameof(DesktopAnalyzersResources.XmlTextReaderSetInsecureResolutionMessage)
                            )
                        );
                    context.ReportDiagnostic(diag);
                }
            }
コード例 #31
0
ファイル: TestOperationWalker.cs プロジェクト: CAPCHIK/roslyn
        public override void VisitConversionExpression(IConversionExpression operation)
        {
            var usesOperatorMethod = operation.UsesOperatorMethod;
            var operatorMethod = operation.OperatorMethod;
            var converisionKind = operation.ConversionKind;
            var isExplicit = operation.IsExplicit;

            base.VisitConversionExpression(operation);
        }
コード例 #32
0
 public virtual void VisitConversionExpression(IConversionExpression operation)
 {
     DefaultVisit(operation);
 }