string Visit(LocalResolveResult result)
		{
			if (result.IsParameter)
				return result.Variable.Name;
			return result.Variable.Name;
		}
		Value VisitAssignment(LocalResolveResult lhs, ResolveResult rhs)
		{
			var value = Convert(rhs);
			if (lhs.IsParameter)
				context.GetArgumentValue(lhs.Variable.Name).SetValue(evalThread, value);
			else
				context.GetLocalVariableValue(lhs.Variable.Name).SetValue(evalThread, value);
			return value;
		}
		Value Visit(LocalResolveResult result)
		{
			if (result.IsParameter)
				return context.GetArgumentValue(result.Variable.Name);
			return context.GetLocalVariableValue(result.Variable.Name);
		}
		bool HasDependencyCheck(FindReferences referenceFinder, LocalResolveResult localResolveResult)
		{
			bool result = false;
			referenceFinder.FindLocalReferences(localResolveResult.Variable, context.UnresolvedFile,
			                                    (SyntaxTree)context.RootNode, context.Compilation,
			                                    (node, resolveResult) => {
				result |= VariableHasBeenConverted(localResolveResult.Variable);
			}, CancellationToken.None);
			return result;
		}
Example #5
0
            void CollectIssues(AstNode variableDecl, BlockStatement rootStatement, LocalResolveResult resolveResult)
            {
                if (rootStatement == null || resolveResult == null)
                {
                    return;
                }
                var references    = new HashSet <AstNode> ();
                var refStatements = new HashSet <Statement> ();
                var usedInLambda  = false;

                refFinder.FindLocalReferences(resolveResult.Variable, ctx.UnresolvedFile, unit, ctx.Compilation,
                                              (astNode, rr) => {
                    if (usedInLambda || astNode == variableDecl)
                    {
                        return;
                    }

                    var parent = astNode.Parent;
                    while (!(parent == null || parent is Statement || parent is LambdaExpression))
                    {
                        parent = parent.Parent;
                    }
                    if (parent == null)
                    {
                        return;
                    }

                    var statement = parent as Statement;
                    if (statement != null)
                    {
                        references.Add(astNode);
                        refStatements.Add(statement);
                    }

                    while (parent != null && parent != rootStatement)
                    {
                        if (parent is LambdaExpression || parent is AnonymousMethodExpression)
                        {
                            usedInLambda = true;
                            break;
                        }
                        parent = parent.Parent;
                    }
                }, ctx.CancellationToken);

                // stop analyzing if the variable is used in any lambda expression or anonymous method
                if (usedInLambda)
                {
                    return;
                }

                var startNode           = VariableReferenceGraphBuilder.Build(rootStatement, references, refStatements, ctx);
                var variableInitializer = variableDecl as VariableInitializer;

                if (variableInitializer != null && !variableInitializer.Initializer.IsNull)
                {
                    startNode.References.Insert(0, variableInitializer);
                }

                ProcessNodes(startNode);
            }
Example #6
0
        static string GetText(ResolveResult result, string expression, out bool debuggerCanShowValue)
        {
            debuggerCanShowValue = false;
            if (result == null)
            {
                // when pressing control, show the expression even when it could not be resolved
                return((Control.ModifierKeys == Keys.Control) ? "" : null);
            }
            if (result is MixedResolveResult)
            {
                return(GetText(((MixedResolveResult)result).PrimaryResult, expression, out debuggerCanShowValue));
            }
            else if (result is DelegateCallResolveResult)
            {
                return(GetText(((DelegateCallResolveResult)result).Target, expression, out debuggerCanShowValue));
            }

            IAmbience ambience = AmbienceService.GetCurrentAmbience();

            ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames;
            if (result is MemberResolveResult)
            {
                return(GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember, expression, out debuggerCanShowValue));
            }
            else if (result is LocalResolveResult)
            {
                LocalResolveResult rr = (LocalResolveResult)result;
                ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames
                                           | ConversionFlags.ShowReturnType | ConversionFlags.ShowDefinitionKeyWord;
                StringBuilder b = new StringBuilder();
                if (rr.IsParameter)
                {
                    b.Append(StringParser.Parse("${res:MainWindow.Editor.Tooltip.Parameter} "));
                }
                else
                {
                    b.Append(StringParser.Parse("${res:MainWindow.Editor.Tooltip.LocalVar} "));
                }
                b.Append(ambience.Convert(rr.Field));
                if (currentDebugger != null)
                {
                    string currentValue = currentDebugger.GetValueAsString(rr.VariableName);
                    if (currentValue != null)
                    {
                        debuggerCanShowValue = true;
                        b.Append(" = ");
                        if (currentValue.Length > 256)
                        {
                            currentValue = currentValue.Substring(0, 256) + "...";
                        }
                        b.Append(currentValue);
                    }
                }
                return(b.ToString());
            }
            else if (result is NamespaceResolveResult)
            {
                return(StringParser.Parse("${res:MainWindow.Editor.Tooltip.Namespace} ") + ((NamespaceResolveResult)result).Name);
            }
            else if (result is TypeResolveResult)
            {
                IClass c = ((TypeResolveResult)result).ResolvedClass;
                if (c != null)
                {
                    return(GetMemberText(ambience, c, expression, out debuggerCanShowValue));
                }
                else
                {
                    return(ambience.Convert(result.ResolvedType));
                }
            }
            else if (result is MethodGroupResolveResult)
            {
                MethodGroupResolveResult mrr = result as MethodGroupResolveResult;
                IMethod m  = mrr.GetMethodIfSingleOverload();
                IMethod m2 = mrr.GetMethodWithEmptyParameterList();
                if (m != null)
                {
                    return(GetMemberText(ambience, m, expression, out debuggerCanShowValue));
                }
                else if (ambience is VBNetAmbience && m2 != null)
                {
                    return(GetMemberText(ambience, m2, expression, out debuggerCanShowValue));
                }
                else
                {
                    return(StringParser.Parse("${res:MainWindow.Editor.Tooltip.UnresolvedOverload} ") + ambience.Convert(mrr.ContainingType) + "." + mrr.Name);
                }
            }
            else
            {
                if (Control.ModifierKeys == Keys.Control)
                {
                    if (result.ResolvedType != null)
                    {
                        return("expression of type " + ambience.Convert(result.ResolvedType));
                    }
                    else
                    {
                        return("ResolveResult without ResolvedType");
                    }
                }
                else
                {
                    return(null);
                }
            }
        }
		private JsBlockStatement GenerateUsingBlock(LocalResolveResult resource, Expression aquisitionExpression, DomRegion tempVariableRegion, JsBlockStatement body) {
			SetRegion(aquisitionExpression.GetRegion());
			var boolType = _compilation.FindType(KnownTypeCode.Boolean);
			var systemIDisposable = _compilation.FindType(KnownTypeCode.IDisposable);
			var disposeMethod = systemIDisposable.GetMethods().Single(m => m.Name == "Dispose");
			var conversions = CSharpConversions.Get(_compilation);

			var aquisitionResolveResult = _resolver.Resolve(aquisitionExpression);
			var compiledAquisition = _expressionCompiler.Compile(aquisitionResolveResult, true);

			var stmts = new List<JsStatement>();
			stmts.AddRange(compiledAquisition.AdditionalStatements);
			stmts.Add(JsStatement.Var(_variables[resource.Variable].Name, MaybeCloneValueType(compiledAquisition.Expression, aquisitionResolveResult, resource.Type)));

			bool isDynamic = resource.Type.Kind == TypeKind.Dynamic;

			if (isDynamic) {
				var newResource = CreateTemporaryVariable(systemIDisposable, tempVariableRegion);
				var castExpr = _expressionCompiler.Compile(new ConversionResolveResult(systemIDisposable, resource, conversions.ExplicitConversion(resource, systemIDisposable)), true);
				stmts.AddRange(castExpr.AdditionalStatements);
				stmts.Add(JsStatement.Var(_variables[newResource].Name, castExpr.Expression));
				resource = new LocalResolveResult(newResource);
			}

			var compiledDisposeCall = _expressionCompiler.Compile(
			                              new CSharpInvocationResolveResult(
			                                  new ConversionResolveResult(systemIDisposable, resource, conversions.ImplicitConversion(resource, systemIDisposable)),
			                                  disposeMethod,
			                                  new ResolveResult[0]
			                              ), false);
			if (compiledDisposeCall.AdditionalStatements.Count > 0)
				_errorReporter.InternalError("Type test cannot return additional statements.");

			JsStatement releaseStmt;
			if (isDynamic) {
				releaseStmt = compiledDisposeCall.Expression;
			}
			else {
				// if (d != null) ((IDisposable)d).Dispose()
				var compiledTest = _expressionCompiler.Compile(new OperatorResolveResult(boolType, ExpressionType.NotEqual, resource, new ConstantResolveResult(resource.Type, null)), true);
				if (compiledTest.AdditionalStatements.Count > 0)
					_errorReporter.InternalError("Null test cannot return additional statements.");
				releaseStmt = resource.Type.IsReferenceType == false && !resource.Type.IsKnownType(KnownTypeCode.NullableOfT) ? (JsStatement)compiledDisposeCall.Expression : JsStatement.If(compiledTest.Expression, compiledDisposeCall.Expression, null);
			}

			stmts.Add(JsStatement.Try(body, null, releaseStmt));

			return JsStatement.Block(stmts);
		}
        private JsBlockStatement GenerateUsingBlock(LocalResolveResult resource, Expression aquisitionExpression, DomRegion tempVariableRegion, JsBlockStatement body)
        {
            var boolType = _compilation.FindType(KnownTypeCode.Boolean);
            var systemIDisposable = _compilation.FindType(KnownTypeCode.IDisposable);
            var disposeMethod = systemIDisposable.GetMethods().Single(m => m.Name == "Dispose");
            var conversions = CSharpConversions.Get(_compilation);

            var compiledAquisition = CompileExpression(aquisitionExpression, true);

            var stmts = new List<JsStatement>();
            stmts.AddRange(compiledAquisition.AdditionalStatements);
            stmts.Add(new JsVariableDeclarationStatement(new JsVariableDeclaration(_variables[resource.Variable].Name, compiledAquisition.Expression)));

            bool isDynamic = resource.Type.Kind == TypeKind.Dynamic;

            if (isDynamic) {
                var newResource = CreateTemporaryVariable(systemIDisposable, tempVariableRegion);
                var castExpr = _expressionCompiler.Compile(_filename, aquisitionExpression.StartLocation, new ConversionResolveResult(systemIDisposable, resource, conversions.ExplicitConversion(resource, systemIDisposable)), true);
                stmts.AddRange(castExpr.AdditionalStatements);
                stmts.Add(new JsVariableDeclarationStatement(new JsVariableDeclaration(_variables[newResource].Name, castExpr.Expression)));
                resource = new LocalResolveResult(newResource);
            }

            var compiledDisposeCall = _expressionCompiler.Compile(_filename, aquisitionExpression.StartLocation,
                                          new CSharpInvocationResolveResult(
                                              new ConversionResolveResult(systemIDisposable, resource, conversions.ImplicitConversion(resource, systemIDisposable)),
                                              disposeMethod,
                                              new ResolveResult[0]
                                          ), false);
            if (compiledDisposeCall.AdditionalStatements.Count > 0)
                _errorReporter.InternalError("Type test cannot return additional statements.", _filename, aquisitionExpression.StartLocation);

            JsStatement releaseStmt;
            if (isDynamic) {
                releaseStmt = new JsExpressionStatement(compiledDisposeCall.Expression);
            }
            else {
                // if (d != null) ((IDisposable)d).Dispose()
                var compiledTest = _expressionCompiler.Compile(_filename, aquisitionExpression.StartLocation, new OperatorResolveResult(boolType, ExpressionType.NotEqual, resource, new ConstantResolveResult(resource.Type, null)), true);
                if (compiledTest.AdditionalStatements.Count > 0)
                    _errorReporter.InternalError("Null test cannot return additional statements.", _filename, aquisitionExpression.StartLocation);
                releaseStmt = new JsIfStatement(compiledTest.Expression, new JsExpressionStatement(compiledDisposeCall.Expression), null);
            }

            stmts.Add(new JsTryCatchFinallyStatement(body, null, releaseStmt));

            return new JsBlockStatement(stmts);
        }
Example #9
0
 public ReferenceResult(AstNode node, LocalResolveResult resolveResult)
 {
     Node          = node;
     ResolveResult = resolveResult;
 }
Example #10
0
 public override object VisitLocalResolveResult(LocalResolveResult rr, object data)
 {
     _usedVariables.Add(rr.Variable);
     return(base.VisitLocalResolveResult(rr, data));
 }
 public virtual TResult VisitLocalResolveResult(LocalResolveResult rr, TData data)
 {
     VisitChildResolveResults(rr, data);
     return(default(TResult));
 }
Example #12
0
			void CollectIssues (AstNode variableDecl, BlockStatement rootStatement, LocalResolveResult resolveResult)
			{
				if (rootStatement == null || resolveResult == null)
					return;
				var references = new HashSet<AstNode> ();
				var refStatements = new HashSet<Statement> ();
				var usedInLambda = false;
				refFinder.FindLocalReferences (resolveResult.Variable, ctx.UnresolvedFile, unit, ctx.Compilation,
					(astNode, rr) => {
						if (usedInLambda || astNode == variableDecl)
							return;

						var parent = astNode.Parent;
						while (!(parent == null || parent is Statement || parent is LambdaExpression))
							parent = parent.Parent;
						if (parent == null)
							return;

						var statement = parent as Statement;
						if (statement != null) {
							references.Add (astNode);
							refStatements.Add (statement);
						}

						while (parent != null && parent != rootStatement) {
							if (parent is LambdaExpression || parent is AnonymousMethodExpression) {
								usedInLambda = true;
								break;
							}
							parent = parent.Parent;
						}
					}, ctx.CancellationToken);

				// stop analyzing if the variable is used in any lambda expression or anonymous method
				if (usedInLambda)
					return;

				var startNode = VariableReferenceGraphBuilder.Build (rootStatement, references, refStatements, ctx);
				var variableInitializer = variableDecl as VariableInitializer;
				if (variableInitializer != null && !variableInitializer.Initializer.IsNull)
					startNode.References.Insert (0, variableInitializer);

				ProcessNodes (startNode);
			}
Example #13
0
 public ReferenceResult(AstNode node, LocalResolveResult resolveResult)
 {
     Node = node;
     ResolveResult = resolveResult;
 }
            public override object TrackedVisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
            {
                if (this.FoundResourceSet == null &&                                                                                                        // skip if already found to improve performance
                    assignmentExpression.Op == AssignmentOperatorType.Assign && this.PositionAvailable &&
                    (!this.isLocalVariable || this.resourceManagerMember.Region.IsInside(this.CurrentNodeStartLocation.Y, this.CurrentNodeStartLocation.X)) // skip if local variable is out of scope
                    )
                {
                    IMember       resolvedMember = null;
                    ResolveResult rr             = this.Resolve(assignmentExpression.Left);
                    if (rr != null)
                    {
                        // Support both local variables and member variables
                        MemberResolveResult mrr = rr as MemberResolveResult;
                        if (mrr != null)
                        {
                            resolvedMember = mrr.ResolvedMember;
                        }
                        else
                        {
                            LocalResolveResult lrr = rr as LocalResolveResult;
                            if (lrr != null)
                            {
                                resolvedMember = lrr.Field;
                            }
                        }
                    }

                    if (resolvedMember != null)
                    {
                                                #if DEBUG
                        LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver: Resolved member: " + resolvedMember.ToString());
                                                #endif

                        // HACK: The GetType()s are necessary because the DOM IComparable implementations try to cast the parameter object to their own interface type which may fail.
                        if (resolvedMember.GetType().Equals(this.resourceManagerMember.GetType()) && resolvedMember.CompareTo(this.resourceManagerMember) == 0)
                        {
                                                        #if DEBUG
                            LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver found assignment to field: " + assignmentExpression.ToString());
                                                        #endif
                            data = true;

                            // Resolving the property association only makes sense if
                            // there is a possible relationship between the return types
                            // of the resolved member and the member we are looking for.
                        }
                        else if (this.compilationUnit != null && !this.isLocalVariable &&
                                 IsTypeRelationshipPossible(resolvedMember, this.resourceManagerMember))
                        {
                            if (this.resourceManagerMember is IProperty && resolvedMember is IField)
                            {
                                // Find out if the resourceManagerMember is a property whose get block returns the value of the resolved member.

                                // We might already have found this association in the
                                // resourceManagerFieldAccessedByProperty field.
                                this.TryResolveResourceManagerProperty();

                                if (this.resourceManagerFieldAccessedByProperty != null && this.resourceManagerFieldAccessedByProperty.CompareTo(resolvedMember) == 0)
                                {
                                                                        #if DEBUG
                                    LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver found assignment to field: " + assignmentExpression.ToString());
                                                                        #endif
                                    data = true;
                                }
                            }
                            else if (this.resourceManagerMember is IField && resolvedMember is IProperty)
                            {
                                // Find out if the resolved member is a property whose set block assigns the value to the resourceManagerMember.

                                PropertyFieldAssociationVisitor visitor = new PropertyFieldAssociationVisitor((IField)this.resourceManagerMember, this.FileName, this.FileContent);
                                this.compilationUnit.AcceptVisitor(visitor, null);
                                if (visitor.AssociatedProperty != null && visitor.AssociatedProperty.CompareTo(resolvedMember) == 0)
                                {
                                                                        #if DEBUG
                                    LoggingService.Debug("ResourceToolkit: BclNRefactoryResourceResolver found assignment to property: " + assignmentExpression.ToString());
                                                                        #endif
                                    data = true;
                                }
                            }
                        }
                    }
                }
                return(base.TrackedVisitAssignmentExpression(assignmentExpression, data));
            }
        static string GetText(ResolveResult result)
        {
            if (result == null)
            {
                return(null);
            }
            if (result is MixedResolveResult)
            {
                return(GetText(((MixedResolveResult)result).PrimaryResult));
            }
            IAmbience ambience = MainForm.IsVisualBasic ? (IAmbience) new VBNetAmbience() : new CSharpAmbience();

            ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility;
            if (result is MemberResolveResult)
            {
                return(GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember));
            }
            else if (result is LocalResolveResult)
            {
                LocalResolveResult rr = (LocalResolveResult)result;
                ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames
                                           | ConversionFlags.ShowReturnType;
                StringBuilder b = new StringBuilder();
                if (rr.IsParameter)
                {
                    b.Append("parameter ");
                }
                else
                {
                    b.Append("local variable ");
                }
                b.Append(ambience.Convert(rr.Field));
                return(b.ToString());
            }
            else if (result is NamespaceResolveResult)
            {
                return("namespace " + ((NamespaceResolveResult)result).Name);
            }
            else if (result is TypeResolveResult)
            {
                IClass c = ((TypeResolveResult)result).ResolvedClass;
                if (c != null)
                {
                    return(GetMemberText(ambience, c));
                }
                else
                {
                    return(ambience.Convert(result.ResolvedType));
                }
            }
            else if (result is MethodGroupResolveResult)
            {
                MethodGroupResolveResult mrr = result as MethodGroupResolveResult;
                IMethod m = mrr.GetMethodIfSingleOverload();
                if (m != null)
                {
                    return(GetMemberText(ambience, m));
                }
                else
                {
                    return("Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name);
                }
            }
            else
            {
                return(null);
            }
        }
Example #16
0
        static string GetText(ResolveResult result, string expression, out bool debuggerCanShowValue)
        {
            debuggerCanShowValue = false;
            if (result == null)
            {
                // when pressing control, show the expression even when it could not be resolved
                return((Control.ModifierKeys == Keys.Control) ? "" : null);
            }
            if (result is MixedResolveResult)
            {
                return(GetText(((MixedResolveResult)result).PrimaryResult, expression, out debuggerCanShowValue));
            }
            IAmbience ambience = AmbienceService.CurrentAmbience;

            ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility;
            if (result is MemberResolveResult)
            {
                return(GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember, expression, out debuggerCanShowValue));
            }
            else if (result is LocalResolveResult)
            {
                LocalResolveResult rr = (LocalResolveResult)result;
                ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames
                                           | ConversionFlags.ShowReturnType
                                           | ConversionFlags.QualifiedNamesOnlyForReturnTypes;
                StringBuilder b = new StringBuilder();
                if (rr.IsParameter)
                {
                    b.Append("parameter ");
                }
                else
                {
                    b.Append("local variable ");
                }
                b.Append(ambience.Convert(rr.Field));
                if (currentDebugger != null)
                {
                    string currentValue = currentDebugger.GetValueAsString(rr.Field.Name);
                    if (currentValue != null)
                    {
                        debuggerCanShowValue = true;
                        b.Append(" = ");
                        b.Append(currentValue);
                    }
                }
                return(b.ToString());
            }
            else if (result is NamespaceResolveResult)
            {
                return("namespace " + ((NamespaceResolveResult)result).Name);
            }
            else if (result is TypeResolveResult)
            {
                IClass c = ((TypeResolveResult)result).ResolvedClass;
                if (c != null)
                {
                    return(GetMemberText(ambience, c, expression, out debuggerCanShowValue));
                }
                else
                {
                    return(ambience.Convert(result.ResolvedType));
                }
            }
            else if (result is MethodResolveResult)
            {
                MethodResolveResult mrr = result as MethodResolveResult;
                IMethod             m   = mrr.GetMethodIfSingleOverload();
                if (m != null)
                {
                    return(GetMemberText(ambience, m, expression, out debuggerCanShowValue));
                }
                else
                {
                    return("Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name);
                }
            }
            else
            {
                if (Control.ModifierKeys == Keys.Control)
                {
                    if (result.ResolvedType != null)
                    {
                        return("expression of type " + ambience.Convert(result.ResolvedType));
                    }
                    else
                    {
                        return("ResolveResult without ResolvedType");
                    }
                }
                else
                {
                    return(null);
                }
            }
        }
Example #17
0
            void CollectIssues(AstNode variableDecl, BlockStatement rootStatement, LocalResolveResult resolveResult)
            {
                if (rootStatement == null || resolveResult == null)
                {
                    return;
                }

                var references    = new HashSet <AstNode>();
                var refStatements = new HashSet <Statement>();
                var usedInLambda  = false;
                var results       = ctx.FindReferences(rootStatement, resolveResult.Variable);

                foreach (var result in results)
                {
                    var node = result.Node;
                    if (node == variableDecl)
                    {
                        continue;
                    }

                    var parent = node.Parent;
                    while (!(parent == null || parent is Statement || parent is LambdaExpression))
                    {
                        parent = parent.Parent;
                    }
                    if (parent == null)
                    {
                        continue;
                    }

                    var statement = parent as Statement;
                    if (statement != null)
                    {
                        references.Add(node);
                        refStatements.Add(statement);
                    }

                    while (parent != null && parent != rootStatement)
                    {
                        if (parent is LambdaExpression || parent is AnonymousMethodExpression)
                        {
                            usedInLambda = true;
                            break;
                        }
                        parent = parent.Parent;
                    }
                    if (usedInLambda)
                    {
                        break;
                    }
                }

                // stop analyzing if the variable is used in any lambda expression or anonymous method
                if (usedInLambda)
                {
                    return;
                }

                var startNode           = new VariableReferenceGraphBuilder(ctx).Build(rootStatement, references, refStatements, ctx);
                var variableInitializer = variableDecl as VariableInitializer;

                if (variableInitializer != null && !variableInitializer.Initializer.IsNull)
                {
                    startNode.References.Insert(0, variableInitializer);
                }

                ProcessNodes(startNode);
            }
Example #18
0
        public void ClosureTypelessArgument()
        {
            LocalResolveResult rr = Resolve <LocalResolveResult>("myObject", "/*inRecursiveClosure*/");

            Assert.AreEqual("System.Object", rr.ResolvedType.FullyQualifiedName);
        }
            void CollectIssues(AstNode variableDecl, AstNode rootNode, LocalResolveResult resolveResult)
            {
                if (resolveResult == null)
                    return;
                var type = resolveResult.Type;
                var typeDef = type.GetDefinition ();
                if (typeDef == null ||
                    (typeDef.KnownTypeCode != KnownTypeCode.IEnumerable &&
                     typeDef.KnownTypeCode != KnownTypeCode.IEnumerableOfT))
                    return;

                FindReferences (variableDecl, rootNode, resolveResult.Variable);

                var statements = AnalysisStatementCollector.Collect (variableDecl);
                var builder = new VariableReferenceGraphBuilder (ctx);
                foreach (var statement in statements) {
                    var vrNode = builder.Build (statement, references, refStatements, ctx);
                    FindMultipleEnumeration (vrNode);
                }
                foreach (var lambda in lambdaExpressions) {
                    var vrNode = builder.Build (references, ctx.Resolver, (Expression)lambda.Body);
                    FindMultipleEnumeration (vrNode);
                }
            }
Example #20
0
        public void Boo629VariableScope()
        {
            LocalResolveResult rr = Resolve <LocalResolveResult>(regressionProg, "boo629", "/*1*/");

            Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName);
        }
		private JsBlockStatement CompileCatchClause(LocalResolveResult catchVariable, CatchClause catchClause, bool isCatchAll, bool isOnly) {
			SetRegion(catchClause.GetRegion());
			JsStatement variableDeclaration = null;
			if (!catchClause.VariableNameToken.IsNull) {
				JsExpression compiledAssignment;
				if (isCatchAll)	// If this is the only handler we need to construct the exception
					compiledAssignment = isOnly ? _runtimeLibrary.MakeException(JsExpression.Identifier(_variables[catchVariable.Variable].Name), this) : JsExpression.Identifier(_variables[catchVariable.Variable].Name);
				else
					compiledAssignment = _runtimeLibrary.Downcast(JsExpression.Identifier(_variables[catchVariable.Variable].Name), _compilation.FindType(KnownTypeCode.Exception), _resolver.Resolve(catchClause.Type).Type, this);

				variableDeclaration = JsStatement.Var(_variables[((LocalResolveResult)_resolver.Resolve(catchClause.VariableNameToken)).Variable].Name, compiledAssignment);
			}

			var result = CreateInnerCompiler().Compile(catchClause.Body);
			if (variableDeclaration != null)
				result = JsStatement.Block(new[] { variableDeclaration }.Concat(result.Statements));
			return result;
		}
Example #22
0
 public virtual object VisitLocalResolveResult(LocalResolveResult rr, object data)
 {
     VisitChildResolveResults(rr, data);
     return(null);
 }
			public override object VisitLocalResolveResult(LocalResolveResult rr, object data) {
				_usedVariables.Add(rr.Variable);
				return base.VisitLocalResolveResult(rr, data);
			}
Example #24
0
 public object VisitLocalResolveResult(LocalResolveResult res)
 {
     throw new NotImplementedException();
 }