public Var GetVar() { _parseInfo = _contextHandler.ParseInfo; _diagnostics = _parseInfo.Script.Diagnostics; _nameRange = _contextHandler.GetNameRange(); _name = _contextHandler.GetName() ?? "?"; // Get then check components. ComponentCollection = new VariableComponentCollection(_diagnostics); _contextHandler.GetComponents(ComponentCollection); CheckComponents(); ComponentCollection.FinishedObtainingComponents(); _scope = _scopeHandler.GetScope(ComponentCollection.IsAttribute(AttributeType.Static)); // Create the varinfo. _varInfo = new VarInfo(_name, _contextHandler.GetDefineLocation(), _parseInfo); _varInfo.Scope = _scope; // Get the variable type. _typeRange = _contextHandler.GetTypeRange(); GetCodeType(); // Get the variable being overriden. GetOverridenVariable(); // If the type of the variable is PortableLambdaType, set the TokenType to Function if (_varInfo.Type is Lambda.PortableLambdaType) { _varInfo.TokenType = SemanticTokenType.Function; } // Apply attributes. ComponentCollection.Apply(_varInfo); Apply(); TypeCheck(); _varInfo.Recursive = IsRecursive(); // Get the resulting variable. var result = new Var(_varInfo); // Add the variable to the operational scope. if (_nameRange != null) { _scopeHandler.CheckConflict(_parseInfo, new(_name), _nameRange); } _scopeHandler.Add(result.GetDefaultInstance(_scopeHandler.DefinedIn()), ComponentCollection.IsAttribute(AttributeType.Static)); // Done return(result); }
private DefinedMethodProvider(ParseInfo parseInfo, IScopeHandler scopeProvider, FunctionContext context, IDefinedTypeInitializer containingType) { _parseInfo = parseInfo; Context = context; ContainingType = containingType; CallInfo = new CallInfo(new RecursiveCallHandler(this, context.Subroutine || context.Attributes.Recursive), parseInfo.Script, ContentReady); DocRange nameRange = context.Identifier.Range; // Get the attributes. var attributes = new GenericAttributeAppender(AttributeType.Ref, AttributeType.In, AttributeType.GlobalVar, AttributeType.PlayerVar); AttributesGetter.GetAttributes(parseInfo.Script.Diagnostics, context.Attributes, attributes); // Set the attributes. Static = attributes.IsStatic; Recursive = attributes.IsRecursive; Virtual = attributes.IsVirtual; AccessLevel = attributes.Accessor; Recursive = attributes.IsRecursive; // Get subroutine info. if (context.Subroutine) { IsSubroutine = true; SubroutineName = context.Subroutine.Text.RemoveQuotes(); SubroutineDefaultGlobal = !context.PlayerVar; } // Setup the scope. var containingScope = scopeProvider.GetScope(Static); containingScope.MethodContainer = true; _methodScope = containingScope.Child(true); // Get the generics. GenericTypes = AnonymousType.GetGenerics(parseInfo, context.TypeArguments, this); foreach (var type in GenericTypes) { _methodScope.AddType(new GenericCodeTypeInitializer(type)); } // Get the type. if (!context.Type.IsVoid) { ReturnType = TypeFromContext.GetCodeTypeFromContext(parseInfo, _methodScope, context.Type); } // Setup the parameters. ParameterProviders = ParameterProvider.GetParameterProviders(parseInfo, _methodScope, context.Parameters, IsSubroutine); ParameterTypes = ParameterProviders.Select(p => p.Type).ToArray(); // Override if (attributes.IsOverride) { OverridingFunction = (DefinedMethodInstance)scopeProvider.GetOverridenFunction(parseInfo.TranslateInfo, new FunctionOverrideInfo(Name, ParameterTypes)); if (OverridingFunction == null) { SemanticsHelper.CouldNotOverride(parseInfo, nameRange, "method"); } } // Check conflicts and add to scope. scopeProvider.CheckConflict(parseInfo, new(Name, ParameterTypes), nameRange); scopeProvider.Add(GetDefaultInstance(scopeProvider.DefinedIn()), Static); // Add LSP elements // Hover parseInfo.Script.AddHover(nameRange, GetLabel(parseInfo.TranslateInfo, LabelInfo.Hover)); // 'references' code lens parseInfo.Script.AddCodeLensRange(new ReferenceCodeLensRange(this, parseInfo, CodeLensSourceType.Function, DefinedAt.range)); // Rename & go-to-definition parseInfo.Script.Elements.AddDeclarationCall(this, new DeclarationCall(nameRange, true)); // todo: 'override' code lens // if (Attributes.IsOverrideable) // parseInfo.Script.AddCodeLensRange(new ImplementsCodeLensRange(this, parseInfo.Script, CodeLensSourceType.Function, nameRange)); // Add the CallInfo to the recursion check. parseInfo.TranslateInfo.GetComponent <RecursionCheckComponent>().AddCheck(CallInfo); // Queue content for staged initiation. parseInfo.TranslateInfo.StagedInitiation.On(this); }