private static String GetLeafNodeValue(Semantics.Node n, ISemanticsNodeMaker nm, String ErrorCause) { if (!n.OnLeaf) { throw new Syntax.InvalidEvaluationException(ErrorCause, nm.GetFileRange(n), n); } return(n.Leaf); }
private static TypeRef ParseTypeRef(TFSemantics.Node TypeNode, ISemanticsNodeMaker nm, Dictionary <Object, TextRange> Positions) { var ts = ParseTypeSpec(TypeNode, nm, Positions); if (!ts.OnTypeRef) { throw new InvalidEvaluationException("ExpectedTypeRef", nm.GetFileRange(ts), ts); } return(ts.TypeRef); }
private static TypeSpec ParseTypeSpec(TFSemantics.Node TypeNode, ISemanticsNodeMaker nm, Dictionary <Object, TextRange> Positions) { var TypeSpecString = GetLeafNodeValue(TypeNode, nm, "InvalidTypeSpec"); var InnerPositions = new Dictionary <Object, TextRange>(); var ts = OS.TypeParser.ParseTypeSpec ( TypeSpecString, (o, Start, End) => { var oRange = nm.GetRange(TypeNode); if (oRange.OnSome) { var Range = oRange.Value; var TypeRange = new TextRange { Start = nm.Text.Calc(Range.Start, Start), End = nm.Text.Calc(Range.Start, End) }; InnerPositions.Add(o, TypeRange); } }, Index => { var FileRange = TreeFormat.Optional <FileTextRange> .Empty; var oRange = nm.GetRange(TypeNode); if (oRange.OnSome) { var Range = oRange.Value; FileRange = new FileTextRange { Text = nm.Text, Range = new TextRange { Start = nm.Text.Calc(Range.Start, Index), End = nm.Text.Calc(Range.Start, Index + 1) } }; } return(new InvalidTokenException("InvalidChar", FileRange, TypeSpecString.Substring(Index, 1))); } ); return(TranslateTypeSpec(ts, nm.Text, InnerPositions, Positions)); }