private static IndexerExpression Clone(IndexerExpression expression)
 {
     var ire = new IndexerExpression(Clone(expression.Target), Clone(expression.Index));
     if (expression.TypeInference.TargetType is StreamsType)
         ire.TypeInference.TargetType = expression.TypeInference.TargetType;
     return ire;
 }
        private Expression ProcessExpression(Expression expression)
        {
            if (expression.TypeInference.TargetType != null && expression.TypeInference.TargetType.IsStreamsType())
            {
                var mre = new MemberReferenceExpression(expression, typeInference.Name) { TypeInference = { Declaration = typeInference, TargetType = typeInference.Type.ResolveType() } };
                if (arrayIndex == null)
                    return mre;
                else
                {
                    var ire = new IndexerExpression(mre, arrayIndex);
                    return ire;
                }
            }

            return expression;
        }
        private Expression Visit(Expression expression)
        {
            Visit((Node)expression);

            if ((expression is VariableReferenceExpression || expression is MemberReferenceExpression || expression is IndexerExpression) && expression.TypeInference.TargetType is StreamsType) // TODO: exclude constants, test real type
            {
                var mre = new MemberReferenceExpression(expression, typeInference.Name) { TypeInference = { Declaration = typeInference, TargetType = typeInference.Type.ResolveType() } };
                if (arrayIndex == null)
                    return mre;
                else
                {
                    var ire = new IndexerExpression(mre, arrayIndex);
                    return ire;
                }
            }
            
            return expression;
        }
        /// <summary>
        /// Find the type of the expression
        /// </summary>
        /// <param name="indexerExpression">the indexer expression</param>
        public override void ProcessIndexerExpression(IndexerExpression indexerExpression)
        {
            var targetType = indexerExpression.Target.TypeInference.TargetType;

            if (targetType is ClassType && (targetType.Name.Text == "InputPatch" || targetType.Name.Text == "OutputPatch" || targetType.Name.Text == "PointStream" || targetType.Name.Text == "StructuredBuffer" || targetType.Name.Text == "RWStructuredBuffer"))
                indexerExpression.TypeInference.TargetType = (targetType as ClassType).GenericArguments[0].ResolveType();
            else
                base.ProcessIndexerExpression(indexerExpression);

            if (!(indexerExpression.Index is LiteralExpression) && indexerExpression.Target.TypeInference.Declaration is Variable)
            {
                var varDecl = indexerExpression.Target.TypeInference.Declaration as Variable;
                if (varDecl.Qualifiers.Contains(StorageQualifier.Extern))
                    Error(XenkoMessageCode.ErrorIndexerNotLiteral, indexerExpression.Span, indexerExpression, analyzedModuleMixin.MixinName);
            }
        }
Example #5
0
 public virtual void Visit(IndexerExpression indexerExpression)
 {
     VisitDynamic(indexerExpression.Target);
     Write("[");
     VisitDynamic(indexerExpression.Index);
     Write("]");
 }
 public ParadoxReplaceExtern(Variable variable, IndexerExpression expression)
     : base(false, true)
 {
     VariableToReplace = variable;
     IndexerReplacement = expression;
 }
Example #7
0
 protected void Visit(IndexerExpression expression)
 {
     // First, dispatch to resolve type of node at deeper level
     Visit((Node)expression);
     
     var indexerType = expression.Index.TypeInference.TargetType;
     if (indexerType != null)
     {
         var baseType = TypeBase.GetBaseType(indexerType);
         if (baseType == ScalarType.Float || baseType == ScalarType.Double)
             expression.Index = Cast(indexerType, ScalarType.Int, expression.Index);
     }
 }
        public override Node Visit(IndexerExpression expression)
        {
            // First, dispatch to resolve type of node at deeper level
            base.Visit(expression);
            
            var indexerType = expression.Index.TypeInference.TargetType;
            if (indexerType != null)
            {
                var baseType = TypeBase.GetBaseType(indexerType);
                if (baseType == ScalarType.Float || baseType == ScalarType.Double)
                    expression.Index = Cast(indexerType, ScalarType.Int, expression.Index);
            }

            return expression;
        }
Example #9
0
        /// <summary>
        /// Find the type of the expression
        /// </summary>
        /// <param name="indexerExpression">the indexer expression</param>
        protected virtual void ProcessIndexerExpression(IndexerExpression indexerExpression)
        {
            TypeBase type = null;
            var targetType = indexerExpression.Target.TypeInference.TargetType;

            if (targetType is ArrayType)
            {
                var arrayType = (ArrayType)targetType;
                if (arrayType.Dimensions.Count == 1)
                {
                    type = arrayType.Type.ResolveType();
                }
                else
                {
                    var dimensions = new List<Expression>(arrayType.Dimensions);
                    dimensions.RemoveAt(0);
                    type = new ArrayType(arrayType.Type, dimensions.ToArray());
                }
            }
            else if (targetType is VectorType)
            {
                type = ((VectorType)targetType).Type.ResolveType();
            }
            else if (targetType is MatrixType)
            {
                type = new VectorType((ScalarType)((MatrixType)targetType).Type.ResolveType(), ((MatrixType)targetType).ColumnCount);
            }
            else if (targetType is ClassType)
            {
                // This is for buffers<type>, especially in compute shaders
                // TODO: check all the cases
                var classType = (ClassType)targetType;
                if (classType.GenericArguments.Count > 0)
                    type = classType.GenericArguments[0];
            }

            indexerExpression.TypeInference.TargetType = type;
            if (type == null)
                Error(MessageCode.ErrorIndexerType, indexerExpression.Span, indexerExpression);
        }
Example #10
0
        protected virtual void Visit(IndexerExpression indexerExpression)
        {
            Visit((Node)indexerExpression);

            ProcessIndexerExpression(indexerExpression);
        }
        /// <summary>
        /// Visits the specified indexer expression.
        /// </summary>
        /// <param name="indexerExpression">The indexer expression.</param>
        public override Node Visit(IndexerExpression indexerExpression)
        {
            base.Visit(indexerExpression);

            ProcessIndexerExpression(indexerExpression);

            return indexerExpression;
        }
 public override Node Visit(IndexerExpression indexerExpression)
 {
     var expression = (Expression)base.Visit(indexerExpression);
     return ProcessExpression(expression);
 }