Exemple #1
0
        public ExpressionParseMatch(IExpression expression, TypePatternElement matchedElement)
        {
            int ResolveFor(Position pos, Position otherPos, List <string> list)
            {
                if (pos.Line.Equals(otherPos.Line))
                {
                    return((int)pos.Character);
                }
                return(pos.ResolveFor(list));
            }

            Expression     = expression;
            MatchedElement = matchedElement;
            ElementInfo    = LoadElementInfo(matchedElement);
            Range          = expression.Range;
            Context        = expression.Context;

            var lines    = expression.Context.Text.SplitOnNewLines();
            var startPos = ResolveFor(Range.Start, Range.End, lines);
            var endPos   = ResolveFor(Range.End, Range.Start, lines);

            RawContent = expression.Context.Text.Substring(startPos, endPos - startPos);
        }
Exemple #2
0
        public void TypePatternConstraintsAreCorrect(string code, SyntaxValueAcceptanceConstraint expected)
        {
            var element = new TypePatternElement(code);

            Assert.Equal(expected, element.Constraint);
        }
        protected override WrappedObject TryParse(ParseContext ctx)
        {
            var clone = ctx.Clone();

            ctx.Properties.WrappedObjectCount++;

            var typePattern    = new TypePatternElement();
            var possibleValues = new List <(int CurrentPosition, List <ParseMatch> expression, ParseResult result)>();

            var startPos = clone.CurrentPosition;

            foreach (var type in WorkspaceManager.CurrentWorkspace.TypesManager.KnownTypesFromAddons)
            {
                //Only match once, multiple types are parsed elsewhere
                if (type.IsPlural)
                {
                    continue;
                }
                clone.Matches.Clear();
                clone.CurrentPosition = startPos;
                typePattern.Type      = type.FinalTypeName;
                if (typePattern.ToString().Contains("%object"))
                {
                    Debugger.Break();
                }

                if (!RuntimeHelpers.TryEnsureSufficientExecutionStack())
                {
                    Debugger.Break();
                }

                var result = typePattern.Parse(clone);

                if (result.IsSuccess)
                {
                    var expression = new List <ParseMatch>(clone.Matches);
                    if (expression.Count > 0)
                    {
                        possibleValues.Add((clone.CurrentPosition, expression, result));
                    }
                }
            }

            {
                //clone.ShouldJustCheckExpressionsThatMatchType = true;
                var expressions =
                    WorkspaceManager.CurrentWorkspace.TypesManager.GetExpressionsThatCanFitType(KnownTypesManager
                                                                                                .JavaLangObjectClass);
                if (expressions != null)
                {
                    foreach (var expression in expressions)
                    {
                        foreach (var pattern in expression.PatternNodes)
                        {
                            if (pattern.ToString().Contains("ExprJavaCall"))
                            {
                                Debugger.Break();
                            }
                            clone.Matches.Clear();
                            clone.CurrentPosition = startPos;
                            clone.StartRangeMeasure();
                            var result = pattern.Parse(clone);

                            if (!result.IsSuccess)
                            {
                                clone.UndoRangeMeasure();
                                continue;
                            }

                            var exprResult = clone.Matches;
                            if (exprResult.Count > 0)
                            {
                                var cloneParseContext = clone.Clone();
                                result.Context = cloneParseContext;
                                var expr = new SkriptExpression(expression, clone.EndRangeMeasure(), cloneParseContext);
                                possibleValues.Add((clone.CurrentPosition,
                                                    new List <ParseMatch>(new[] { new ExpressionParseMatch(expr, null) }), result));
                            }
                        }
                    }
                }
            }

            possibleValues.Sort((c1, c2) => - 1 * c1.CurrentPosition.CompareTo(c2.CurrentPosition));

            if (possibleValues.Count <= 0)
            {
                return(null);
            }

            {
                var(lastPos, matches, _) = possibleValues[0];

                ctx.ReadUntilPosition(lastPos);
                ctx.Properties.WrappedObjectCount--;
                return(new WrappedObject(matches));
            }
        }