private static BoundExpression RewriteLocalInternal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax, LocalSymbol local) { var parameterType = compilation.GetSpecialType(SpecialType.System_String); var getValueMethod = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetVariableValueMethodName, (c, n, s) => { var returnType = compilation.GetSpecialType(SpecialType.System_Object); return new PlaceholderMethodSymbol( c, s, n, returnType, m => ImmutableArray.Create<ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None))); }); var getAddressMethod = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetVariableAddressMethodName, (c, n, s) => { return new PlaceholderMethodSymbol( c, s, n, m => ImmutableArray.Create<TypeParameterSymbol>(new SimpleTypeParameterSymbol(m, 0, "<>T")), m => m.TypeParameters[0], // return type is <>T& m => ImmutableArray.Create<ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None)), returnValueIsByRef: true); }); return new BoundPseudoVariable( syntax, local, new ObjectIdExpressions(compilation, getValueMethod, getAddressMethod), local.Type); }
private static BoundExpression RewriteLocalInternal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax, LocalSymbol local) { var parameterType = compilation.GetSpecialType(SpecialType.System_String); var getValueMethod = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetVariableValueMethodName, (c, n, s) => { var returnType = compilation.GetSpecialType(SpecialType.System_Object); return(new PlaceholderMethodSymbol( c, s, n, returnType, m => ImmutableArray.Create <ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None)))); }); var getAddressMethod = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetVariableAddressMethodName, (c, n, s) => { return(new PlaceholderMethodSymbol( c, s, n, m => ImmutableArray.Create <TypeParameterSymbol>(new SimpleTypeParameterSymbol(m, 0, "<>T")), m => m.TypeParameters[0], // return type is <>T& m => ImmutableArray.Create <ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None)), returnValueIsByRef: true)); }); return(new BoundPseudoVariable( syntax, local, new ObjectIdExpressions(compilation, getValueMethod, getAddressMethod), local.Type)); }
internal override BoundExpression RewriteLocal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax) { var method = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetReturnValueMethodName, (c, n, s) => { var parameterType = compilation.GetSpecialType(SpecialType.System_Int32); var returnType = compilation.GetSpecialType(SpecialType.System_Object); return(new PlaceholderMethodSymbol( c, s, n, returnType, m => ImmutableArray.Create <ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None)))); }); var argument = new BoundLiteral( syntax, Microsoft.CodeAnalysis.ConstantValue.Create(_index), method.Parameters[0].Type); var call = BoundCall.Synthesized( syntax, receiverOpt: null, method: method, arguments: ImmutableArray.Create <BoundExpression>(argument)); return(ConvertToLocalType(compilation, call, this.Type)); }
internal override BoundExpression RewriteLocal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax) { var method = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.GetObjectAtAddressMethodName, (c, n, s) => { var parameterType = compilation.GetSpecialType(SpecialType.System_UInt64); return new PlaceholderMethodSymbol( c, s, n, this.Type, m => ImmutableArray.Create<ParameterSymbol>(new SynthesizedParameterSymbol(m, parameterType, ordinal: 0, refKind: RefKind.None))); }); var argument = new BoundLiteral( syntax, Microsoft.CodeAnalysis.ConstantValue.Create(_address), method.Parameters[0].Type); var call = BoundCall.Synthesized( syntax, receiverOpt: null, method: method, arguments: ImmutableArray.Create<BoundExpression>(argument)); Debug.Assert(call.Type == this.Type); return call; }
private static void RewriteLocalDeclaration( CSharpCompilation compilation, EENamedTypeSymbol container, HashSet <LocalSymbol> declaredLocals, ArrayBuilder <BoundStatement> statements, BoundLocalDeclaration node) { Debug.Assert(node.ArgumentsOpt.IsDefault); var local = node.LocalSymbol; var syntax = node.Syntax; declaredLocals.Add(local); var voidType = compilation.GetSpecialType(SpecialType.System_Void); var objectType = compilation.GetSpecialType(SpecialType.System_Object); var typeType = compilation.GetWellKnownType(WellKnownType.System_Type); var stringType = compilation.GetSpecialType(SpecialType.System_String); // <>CreateVariable(Type type, string name) var method = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.CreateVariableMethodName, (c, n, s) => new PlaceholderMethodSymbol( c, s, n, voidType, m => ImmutableArray.Create <ParameterSymbol>( new SynthesizedParameterSymbol(m, typeType, ordinal: 0, refKind: RefKind.None), new SynthesizedParameterSymbol(m, stringType, ordinal: 1, refKind: RefKind.None)))); var type = new BoundTypeOfOperator(syntax, new BoundTypeExpression(syntax, aliasOpt: null, type: local.Type), null, typeType); var name = new BoundLiteral(syntax, ConstantValue.Create(local.Name), stringType); var call = BoundCall.Synthesized( syntax, receiverOpt: null, method: method, arguments: ImmutableArray.Create <BoundExpression>(type, name)); statements.Add(new BoundExpressionStatement(syntax, call)); var initializer = node.InitializerOpt; if (initializer != null) { // Generate assignment to local. The assignment will // be rewritten in PlaceholderLocalRewriter. var assignment = new BoundAssignmentOperator( syntax, new BoundLocal(syntax, local, constantValueOpt: null, type: local.Type), initializer, RefKind.None, local.Type); statements.Add(new BoundExpressionStatement(syntax, assignment)); } }
private static void RewriteLocalDeclaration( CSharpCompilation compilation, EENamedTypeSymbol container, HashSet<LocalSymbol> declaredLocals, ArrayBuilder<BoundStatement> statements, BoundLocalDeclaration node) { Debug.Assert(node.ArgumentsOpt.IsDefault); var local = node.LocalSymbol; var syntax = node.Syntax; declaredLocals.Add(local); var voidType = compilation.GetSpecialType(SpecialType.System_Void); var objectType = compilation.GetSpecialType(SpecialType.System_Object); var typeType = compilation.GetWellKnownType(WellKnownType.System_Type); var stringType = compilation.GetSpecialType(SpecialType.System_String); // <>CreateVariable(Type type, string name) var method = container.GetOrAddSynthesizedMethod( ExpressionCompilerConstants.CreateVariableMethodName, (c, n, s) => new PlaceholderMethodSymbol( c, s, n, voidType, m => ImmutableArray.Create<ParameterSymbol>( new SynthesizedParameterSymbol(m, typeType, ordinal: 0, refKind: RefKind.None), new SynthesizedParameterSymbol(m, stringType, ordinal: 1, refKind: RefKind.None)))); var type = new BoundTypeOfOperator(syntax, new BoundTypeExpression(syntax, aliasOpt: null, type: local.Type), null, typeType); var name = new BoundLiteral(syntax, ConstantValue.Create(local.Name), stringType); var call = BoundCall.Synthesized( syntax, receiverOpt: null, method: method, arguments: ImmutableArray.Create<BoundExpression>(type, name)); statements.Add(new BoundExpressionStatement(syntax, call)); var initializer = node.InitializerOpt; if (initializer != null) { // Generate assignment to local. The assignment will // be rewritten in PlaceholderLocalRewriter. var assignment = new BoundAssignmentOperator( syntax, new BoundLocal(syntax, local, constantValueOpt: null, type: local.Type), initializer, RefKind.None, local.Type); statements.Add(new BoundExpressionStatement(syntax, assignment)); } }
internal override BoundExpression RewriteLocal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax) { Debug.Assert(this.Name == this.Name.ToLowerInvariant()); var method = container.GetOrAddSynthesizedMethod( this.Name, (c, n, s) => { var returnType = compilation.GetWellKnownType(WellKnownType.System_Exception); return new PlaceholderMethodSymbol( c, s, n, returnType, m => ImmutableArray<ParameterSymbol>.Empty); }); var call = BoundCall.Synthesized(syntax, receiverOpt: null, method: method); return ConvertToLocalType(compilation, call, this.Type); }
internal override BoundExpression RewriteLocal(CSharpCompilation compilation, EENamedTypeSymbol container, CSharpSyntaxNode syntax) { Debug.Assert(this.Name == this.Name.ToLowerInvariant()); var method = container.GetOrAddSynthesizedMethod( this.Name, (c, n, s) => { var returnType = compilation.GetWellKnownType(WellKnownType.System_Exception); return(new PlaceholderMethodSymbol( c, s, n, returnType, m => ImmutableArray <ParameterSymbol> .Empty)); }); var call = BoundCall.Synthesized(syntax, receiverOpt: null, method: method); return(ConvertToLocalType(compilation, call, this.Type)); }