public CallMethodAction(ParseInfo parseInfo, Scope scope, DeltinScriptParser.MethodContext methodContext, bool usedAsExpression, Scope getter) { this.translateInfo = parseInfo.TranslateInfo; string methodName = methodContext.PART().GetText(); NameRange = DocRange.GetRange(methodContext.PART()); var options = scope.GetMethodsByName(methodName); if (options.Length == 0) { parseInfo.Script.Diagnostics.Error($"No method by the name of '{methodName}' exists in the current context.", NameRange); } else { OverloadChooser = new OverloadChooser(options, parseInfo, getter, NameRange, DocRange.GetRange(methodContext), new OverloadError("method '" + methodName + "'")); if (methodContext.call_parameters() != null) { OverloadChooser.SetContext(methodContext.call_parameters()); } else if (methodContext.picky_parameters() != null) { OverloadChooser.SetContext(methodContext.picky_parameters()); } else { OverloadChooser.SetContext(); } CallingMethod = (IMethod)OverloadChooser.Overload; ParameterValues = OverloadChooser.Values; if (CallingMethod != null) { if (CallingMethod is DefinedFunction) { var definedFunction = (DefinedFunction)CallingMethod; definedFunction.Call(parseInfo.Script, NameRange); parseInfo.CurrentCallInfo?.Call(definedFunction, NameRange); } parseInfo.Script.AddHover(DocRange.GetRange(methodContext), CallingMethod.GetLabel(true)); if (usedAsExpression && !CallingMethod.DoesReturnValue()) { parseInfo.Script.Diagnostics.Error("The chosen overload for " + methodName + " does not return a value.", NameRange); } } } }
public CreateObjectAction(ParseInfo parseInfo, Scope scope, DeltinScriptParser.Create_objectContext context) { // Get the type. Syntax error if there is no type name. if (context.type == null) { parseInfo.Script.Diagnostics.Error("Expected a type name.", DocRange.GetRange(context.NEW())); } else { CreatingObjectOf = parseInfo.TranslateInfo.Types.GetCodeType(context.type.Text, parseInfo.Script.Diagnostics, DocRange.GetRange(context.type)); } if (CreatingObjectOf != null) { DocRange nameRange = DocRange.GetRange(context.type); // Get the constructor to use. OverloadChooser = new OverloadChooser( CreatingObjectOf.Constructors, parseInfo, CreatingObjectOf.ReturningScope(), scope, nameRange, DocRange.GetRange(context), new OverloadError("type " + CreatingObjectOf.Name) ); if (context.call_parameters() != null) { OverloadChooser.SetContext(context.call_parameters()); } else { OverloadChooser.SetContext(); } Constructor = (Constructor)OverloadChooser.Overload; ConstructorValues = OverloadChooser.Values ?? new IExpression[0]; if (Constructor != null) { parseInfo.TranslateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(Constructor, new Location(parseInfo.Script.Uri, nameRange)); Constructor.Call(parseInfo, DocRange.GetRange(context.type)); parseInfo.Script.AddHover(DocRange.GetRange(context), Constructor.GetLabel(true)); if (Constructor is DefinedConstructor) { parseInfo.CurrentCallInfo?.Call((DefinedConstructor)Constructor, nameRange); } } } }
public CallMethodAction(ParseInfo parseInfo, Scope scope, DeltinScriptParser.MethodContext methodContext, bool usedAsExpression, Scope getter) { this.parseInfo = parseInfo; string methodName = methodContext.PART().GetText(); NameRange = DocRange.GetRange(methodContext.PART()); UsedAsExpression = usedAsExpression; if (methodContext.ASYNC() != null) { if (methodContext.NOT() == null) { Parallel = CallParallel.AlreadyRunning_RestartRule; } else { Parallel = CallParallel.AlreadyRunning_DoNothing; } } var options = scope.GetMethodsByName(methodName); if (options.Length == 0) { parseInfo.Script.Diagnostics.Error($"No method by the name of '{methodName}' exists in the current context.", NameRange); } else { OverloadChooser = new OverloadChooser(options, parseInfo, scope, getter, NameRange, DocRange.GetRange(methodContext), new OverloadError("method '" + methodName + "'")); if (methodContext.call_parameters() != null) { OverloadChooser.SetContext(methodContext.call_parameters()); } else if (methodContext.picky_parameters() != null) { OverloadChooser.SetContext(methodContext.picky_parameters()); } else { OverloadChooser.SetContext(); } CallingMethod = (IMethod)OverloadChooser.Overload; ParameterValues = OverloadChooser.Values; if (CallingMethod != null) { if (CallingMethod is DefinedFunction definedFunction) { definedFunction.OnBlockApply(this); definedFunction.Call(parseInfo, NameRange); parseInfo.CurrentCallInfo?.Call(definedFunction, NameRange); } if (Parallel != CallParallel.NoParallel && !CallingMethod.Attributes.Parallelable) { parseInfo.Script.Diagnostics.Error($"The method '{CallingMethod.Name}' cannot be called in parallel.", NameRange); } parseInfo.Script.AddHover(DocRange.GetRange(methodContext), CallingMethod.GetLabel(true)); } } }