public DefinedEnum(ParseInfo parseInfo, EnumContext enumContext) : base(enumContext.Identifier.Text) { CanBeExtended = false; CanBeDeleted = false; Kind = "enum"; // Check if a type with the same name already exists. if (parseInfo.TranslateInfo.Types.IsCodeType(Name)) { parseInfo.Script.Diagnostics.Error($"A type with the name '{Name}' already exists.", enumContext.Identifier.Range); } _translateInfo = parseInfo.TranslateInfo; Scope = new Scope("enum " + Name); // Set location and symbol link. DefinedAt = new Location(parseInfo.Script.Uri, enumContext.Identifier.Range); _translateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(this, DefinedAt, true); // Get the enum members. for (int i = 0; i < enumContext.Values.Count; i++) { if (enumContext.Values[i].Identifier) { var expression = enumContext.Values[i].Value != null ? new ExpressionOrWorkshopValue(parseInfo.GetExpression(Scope, enumContext.Values[i].Value)) : new ExpressionOrWorkshopValue(new V_Number(i)); var newMember = new DefinedEnumMember(parseInfo, this, enumContext.Values[i].Identifier.Text, new Location(parseInfo.Script.Uri, enumContext.Values[i].Identifier.Range), expression); Scope.AddVariable(newMember, parseInfo.Script.Diagnostics, newMember.DefinedAt.range); } } }
public DefinedEnumMember(ParseInfo parseInfo, DefinedEnum type, string name, int id, Location definedAt) { Enum = type; Name = name; DefinedAt = definedAt; ID = id; _translateInfo = parseInfo.TranslateInfo; _translateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(this, definedAt, true); parseInfo.Script.AddCodeLensRange(new ReferenceCodeLensRange(this, parseInfo, CodeLensSourceType.EnumValue, DefinedAt.range)); }
public DefinedEnumMember(ParseInfo parseInfo, DefinedEnum type, string name, LanguageServer.Location definedAt, ExpressionOrWorkshopValue value) { Enum = type; Name = name; DefinedAt = definedAt; _translateInfo = parseInfo.TranslateInfo; ValueExpression = value; _translateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(this, definedAt, true); parseInfo.Script.AddCodeLensRange(new ReferenceCodeLensRange(this, parseInfo, CodeLensSourceType.EnumValue, DefinedAt.range)); }
public DefinedEnum(ParseInfo parseInfo, DeltinScriptParser.Enum_defineContext enumContext) : base(enumContext.name.Text) { CanBeExtended = false; CanBeDeleted = false; Kind = "enum"; if (parseInfo.TranslateInfo.Types.IsCodeType(Name)) { parseInfo.Script.Diagnostics.Error($"A type with the name '{Name}' already exists.", DocRange.GetRange(enumContext.name)); } _translateInfo = parseInfo.TranslateInfo; Scope = new Scope("enum " + Name); DefinedAt = new Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.name)); _translateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(this, DefinedAt, true); List <DefinedEnumMember> members = new List <DefinedEnumMember>(); // Get the enum members. if (enumContext.firstMember != null) { var firstExpression = (enumContext.expr() != null) ? new ExpressionOrWorkshopValue(parseInfo.GetExpression(Scope, enumContext.expr())) : new ExpressionOrWorkshopValue(new V_Number(0)); members.Add(new DefinedEnumMember(parseInfo, this, enumContext.firstMember.Text, new Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.firstMember)), firstExpression)); if (enumContext.enum_element() != null) { for (int i = 0; i < enumContext.enum_element().Length; i++) { var expression = enumContext.enum_element(i).expr() != null ? new ExpressionOrWorkshopValue(parseInfo.GetExpression(Scope, enumContext.enum_element(i).expr())) : new ExpressionOrWorkshopValue(new V_Number(i + 1)); members.Add(new DefinedEnumMember(parseInfo, this, enumContext.enum_element(i).PART().GetText(), new Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.enum_element(i).PART())), expression)); } } } foreach (var member in members) { Scope.AddVariable(member, parseInfo.Script.Diagnostics, member.DefinedAt.range); } }
public DefinedEnum(ParseInfo parseInfo, DeltinScriptParser.Enum_defineContext enumContext) : base(enumContext.name.Text) { CanBeExtended = false; CanBeDeleted = false; Kind = "enum"; if (parseInfo.TranslateInfo.Types.IsCodeType(Name)) { parseInfo.Script.Diagnostics.Error($"A type with the name '{Name}' already exists.", DocRange.GetRange(enumContext.name)); } _translateInfo = parseInfo.TranslateInfo; Scope = new Scope("enum " + Name); DefinedAt = new LanguageServer.Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.name)); _translateInfo.GetComponent <SymbolLinkComponent>().AddSymbolLink(this, DefinedAt, true); // Get the enum members. List <DefinedEnumMember> members = new List <DefinedEnumMember>(); if (enumContext.firstMember != null) { members.Add(new DefinedEnumMember(parseInfo, this, enumContext.firstMember.Text, 0, new Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.firstMember)))); if (enumContext.enum_element() != null) { for (int i = 0; i < enumContext.enum_element().Length; i++) { members.Add( new DefinedEnumMember( parseInfo, this, enumContext.enum_element(i).PART().GetText(), i + 1, new Location(parseInfo.Script.Uri, DocRange.GetRange(enumContext.enum_element(i).PART())) ) ); } } } foreach (var member in members) { Scope.AddVariable(member, null, null); } }
public override void WorkshopInit(DeltinScript translateInfo) { if (workshopInitialized) { return; } workshopInitialized = true; ClassData classData = translateInfo.GetComponent <ClassData>(); Identifier = classData.AssignID(); int stackOffset = StackStart(false); Extends?.WorkshopInit(translateInfo); for (int i = 0; i < ObjectVariables.Count; i++) { ObjectVariables[i].SetArrayStore(classData.GetClassVariableStack(translateInfo.VarCollection, i + stackOffset)); } }
public void GetDefaults() { _anyType = new AnyType(_deltinScript); _unknownType = new AnyType("?", true, _deltinScript); AddType(_anyType); AddType(_playerType); AddType(_vectorType); AddType(_numberType); AddType(_stringType); AddType(_booleanType); // Enums foreach (var type in ValueGroupType.GetEnumTypes(this)) { AddType(type); } _deltinScript.GetComponent <Pathfinder.PathfinderTypesComponent>(); _deltinScript.PlayerVariableScope = _playerType.PlayerVariableScope; }
public void GetMeta() { X = CreateInternalVar("X", "The X component of the vector.", _typeSupplier.Number()); Y = CreateInternalVar("Y", "The Y component of the vector.", _typeSupplier.Number()); Z = CreateInternalVar("Z", "The Z component of the vector.", _typeSupplier.Number()); HorizontalAngle = CreateInternalVar("HorizontalAngle", "The horizontal angle of the vector.", _typeSupplier.Number()); VerticalAngle = CreateInternalVar("VerticalAngle", "The vertical angle of the vector.", _typeSupplier.Number()); Magnitude = CreateInternalVar("Magnitude", "The magnitude of the vector.", _typeSupplier.Number()); Zero = CreateInternalVar("Zero", "Equal to `Vector(0, 0, 0)`.", _typeSupplier.Vector(), Element.Vector(0, 0, 0), true); _deltinScript.GetComponent <StaticVariableCollection>().AddVariable(Zero.GetDefaultInstance(this)); objectScope.AddNativeMethod(DistanceTo); objectScope.AddNativeMethod(CrossProduct); objectScope.AddNativeMethod(DotProduct); objectScope.AddNativeMethod(Normalize); objectScope.AddNativeMethod(DirectionTowards); objectScope.AddNativeMethod(FarthestPlayer); objectScope.AddNativeMethod(ClosestPlayer); objectScope.AddNativeMethod(IsInLineOfSight); objectScope.AddNativeMethod(Towards); objectScope.AddNativeMethod(AsLocalVector); objectScope.AddNativeMethod(AsWorldVector); Operations.AddTypeOperation(new TypeOperation[] { new TypeOperation(TypeOperator.Add, this, this), // Vector + vector new TypeOperation(TypeOperator.Subtract, this, this), // Vector - vector new TypeOperation(TypeOperator.Multiply, this, this), // Vector * vector new TypeOperation(TypeOperator.Divide, this, this), // Vector / vector new TypeOperation(TypeOperator.Multiply, _typeSupplier.Number(), this), // Vector * number new TypeOperation(TypeOperator.Divide, _typeSupplier.Number(), this), // Vector / number }); Operations.AddTypeOperation(new[] { new AssignmentOperation(AssignmentOperator.AddEqual, this), // += vector new AssignmentOperation(AssignmentOperator.SubtractEqual, this), // -= vector new AssignmentOperation(AssignmentOperator.MultiplyEqual, this), // *= vector new AssignmentOperation(AssignmentOperator.DivideEqual, this), // /= vector new AssignmentOperation(AssignmentOperator.MultiplyEqual, _typeSupplier.Number()), // *= number new AssignmentOperation(AssignmentOperator.DivideEqual, _typeSupplier.Number()) // /= number }); }