public static bool DirectConvertable(DMExpression expr, DMASTDereference astNode) { switch (astNode.Expression) { case DMASTDereference deref when deref.Type == DMASTDereference.DereferenceType.Search: case DMASTProcCall when expr.Path == null: case DMASTDereferenceProc: case DMASTListIndex: return(true); case DMASTDereference deref when expr is Dereference _deref: return(DirectConvertable(_deref._expr, deref)); default: return(false); } }
public void VisitDereference(DMASTDereference dereference) { var expr = DMExpression.Create(_dmObject, _proc, dereference.Expression, _inferredPath); if (dereference.Type == DMASTDereference.DereferenceType.Direct && !Dereference.DirectConvertable(expr, dereference)) { if (expr.Path == null) { throw new CompileErrorException(dereference.Location, $"Invalid property \"{dereference.Property}\""); } DMObject dmObject = DMObjectTree.GetDMObject(expr.Path.Value, false); if (dmObject == null) { throw new CompileErrorException(dereference.Location, $"Type {expr.Path.Value} does not exist"); } var property = dmObject.GetVariable(dereference.Property); if (property != null) { Result = new Expressions.Dereference(dereference.Location, property.Type, expr, dereference.Conditional, dereference.Property); } else { var globalId = dmObject.GetGlobalVariableId(dereference.Property); if (globalId != null) { property = DMObjectTree.Globals[globalId.Value]; Result = new Expressions.GlobalField(dereference.Location, property.Type, globalId.Value); } } if (property == null) { throw new CompileErrorException(dereference.Location, $"Invalid property \"{dereference.Property}\" on type {dmObject.Path}"); } if ((property.Value?.ValType & DMValueType.Unimplemented) == DMValueType.Unimplemented && !DMCompiler.Settings.SuppressUnimplementedWarnings) { DMCompiler.Warning(new CompilerWarning(dereference.Location, $"{dmObject.Path}.{dereference.Property} is not implemented and will have unexpected behavior")); } } else { Result = new Expressions.Dereference(dereference.Location, null, expr, dereference.Conditional, dereference.Property); } }
public DMASTNewDereference(DMASTDereference dereference, DMASTCallParameter[] parameters) { Dereference = dereference; Parameters = parameters; }