public BoundTMPPropertyExternAccessExpression(AbstractPhaseContext context, SyntaxNode node, PropertySymbol propertySymbol, BoundExpression sourceExpression) : base(context, node, BuildProperty(context, sourceExpression, propertySymbol), sourceExpression, null) { ValueType = propertySymbol.Type; }
private static PropertySymbol BuildProperty(AbstractPhaseContext context, BoundExpression sourceExpression, PropertySymbol propertySymbol) { TypeSymbol propertyType = sourceExpression.ValueType; if (propertyType.UdonType.ExternSignature == "VRCUdonUdonBehaviour") { propertyType = context.GetTypeSymbol(typeof(IUdonEventReceiver)); } MethodSymbol setMethod = new ExternSynthesizedMethodSymbol(context, $"set_{propertySymbol.Name}", propertyType, new[] { propertySymbol.Type }, null, false); MethodSymbol getMethod = new ExternSynthesizedMethodSymbol(context, $"get_{propertySymbol.Name}", propertyType, new TypeSymbol[] {}, propertySymbol.Type, false); return(new SynthesizedPropertySymbol(context, getMethod, setMethod)); }
private static PropertySymbol BuildProperty(AbstractPhaseContext context, BoundExpression sourceExpression) { TypeSymbol propertyType = sourceExpression.ValueType; if (propertyType.UdonType.ExternSignature == "VRCUdonUdonBehaviour") { propertyType = context.GetTypeSymbol(typeof(IUdonEventReceiver)); } TypeSymbol boolType = context.GetTypeSymbol(SpecialType.System_Boolean); MethodSymbol setMethod = new ExternSynthesizedMethodSymbol(context, "set_enabled", propertyType, new[] { boolType }, null, false); MethodSymbol getMethod = new ExternSynthesizedMethodSymbol(context, "get_enabled", propertyType, new TypeSymbol[] {}, boolType, false); return(new SynthesizedPropertySymbol(context, getMethod, setMethod)); }
protected BoundPropertyAccessExpression(AbstractPhaseContext context, SyntaxNode node, PropertySymbol property, BoundExpression sourceExpression, BoundExpression[] parameterExpressions) : base(node, sourceExpression) { Property = property; ParameterExpressions = parameterExpressions; }
public BoundEnabledPropertyExternAccessExpression(AbstractPhaseContext context, SyntaxNode node, BoundExpression sourceExpression) : base(context, node, BuildProperty(context, sourceExpression), sourceExpression, null) { ValueType = context.GetTypeSymbol(SpecialType.System_Boolean); }
public BoundExternPropertyAccessExpression(AbstractPhaseContext context, SyntaxNode node, ExternPropertySymbol property, BoundExpression sourceExpression, BoundExpression[] parameterExpressions) : base(context, node, property, sourceExpression, parameterExpressions) { }
public static BoundAccessExpression BindPropertyAccess(AbstractPhaseContext context, SyntaxNode node, PropertySymbol propertySymbol, BoundExpression sourceExpression, BoundExpression[] parameterExpressions = null) { if (propertySymbol is ExternPropertySymbol externProperty) { Type propertyType = externProperty.ContainingType.UdonType.SystemType; if (_allowedConstantPropertyTypes.Contains(propertyType)) { PropertyInfo property = propertyType.GetProperty(externProperty.Name, BindingFlags.Static | BindingFlags.Public); if (property != null) { return(new BoundConstantExpression(property.GetValue(null), propertySymbol.Type)); } } if (propertySymbol.ToString() == "UnityEngine.Behaviour.enabled") { return(new BoundEnabledPropertyExternAccessExpression(context, node, sourceExpression)); } if (propertySymbol.ContainingType.ToString() == "TMPro.TMP_Text") { return(new BoundTMPPropertyExternAccessExpression(context, node, externProperty, sourceExpression)); } return(new BoundExternPropertyAccessExpression(context, node, externProperty, sourceExpression, parameterExpressions)); } return(new BoundUserPropertyAccessExpression(context, node, propertySymbol, sourceExpression, parameterExpressions)); }
private ExternMethodSymbol FindAlternateInvocation(AbstractPhaseContext context, MethodSymbol originalSymbol, BoundExpression instanceExpression, BoundExpression[] parameterExpressions) { if (originalSymbol.IsStatic || originalSymbol.IsConstructor) { return(null); } List <TypeSymbol> candidates = new List <TypeSymbol>(); FindCandidateInvocationTypes(context, candidates, instanceExpression.ValueType); TypeSymbol[] paramTypes = parameterExpressions.Select(ex => ex.ValueType).ToArray(); foreach (TypeSymbol candidate in candidates) { ExternMethodSymbol externMethodSymbol = new ExternSynthesizedMethodSymbol(context, originalSymbol.Name, candidate, paramTypes, originalSymbol.ReturnType, false, false); if (CompilerUdonInterface.IsExposedToUdon(externMethodSymbol.ExternSignature)) { return(externMethodSymbol); } } return(null); }
public BoundExternInvocation(SyntaxNode node, AbstractPhaseContext context, MethodSymbol method, BoundExpression instanceExpression, BoundExpression[] parameterExpressions) : base(node, method, instanceExpression, parameterExpressions) { externMethodSymbol = (ExternMethodSymbol)method; if (!CompilerUdonInterface.IsExposedToUdon(externMethodSymbol.ExternSignature)) { externMethodSymbol = FindAlternateInvocation(context, method, instanceExpression, parameterExpressions); if (externMethodSymbol == null) { throw new NotExposedException(LocStr.CE_UdonMethodNotExposed, node, $"{method.RoslynSymbol?.ToDisplayString() ?? method.ToString()}, sig: {((ExternMethodSymbol)method).ExternSignature}"); } } }