protected override void RuleDidSucceed(object result, StringParserState.Element stateAtStart, StringParserState.Element stateAtEnd) { // Apply DebugMetadata based on the state at the start of the rule // (i.e. use line number as it was at the start of the rule) var parsedObj = result as Parsed.Object; if (parsedObj) { var md = new Runtime.DebugMetadata(); md.startLineNumber = stateAtStart.lineIndex + 1; md.endLineNumber = stateAtEnd.lineIndex + 1; md.fileName = _filename; parsedObj.debugMetadata = md; return; } // A list of objects that doesn't already have metadata? var parsedListObjs = result as List <Parsed.Object>; if (parsedListObjs != null) { foreach (var parsedListObj in parsedListObjs) { if (!parsedListObj.hasOwnDebugMetadata) { var md = new Runtime.DebugMetadata(); md.startLineNumber = stateAtStart.lineIndex + 1; md.endLineNumber = stateAtEnd.lineIndex + 1; md.fileName = _filename; parsedListObj.debugMetadata = md; } } } }
Runtime.DebugMetadata DebugMetadataForContentAtOffset(int offset) { int currOffset = 0; Runtime.DebugMetadata lastValidMetadata = null; foreach (var range in DebugSourceRanges) { if (range.debugMetadata != null) { lastValidMetadata = range.debugMetadata; } if (offset >= currOffset && offset < currOffset + range.length) { return(lastValidMetadata); } currOffset += range.length; } return(null); }