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); } }
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; }
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; }
/// <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); }
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); }