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));
        }
示例#8
0
        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);
        }
示例#9
0
 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}");
         }
     }
 }