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); }
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)); } }