Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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
            });
        }