package org.eclipse.imp.services.base; import java.util.List; import lpg.runtime.Adjunct; import lpg.runtime.IAst; import lpg.runtime.ILexStream; import lpg.runtime.IPrsStream; import lpg.runtime.IToken; public abstract class LPGFolderBase extends FolderBase { protected IPrsStream prsStream; protected void makeFoldableByOffsets(int first_offset, int last_offset) { super.makeAnnotation(first_offset, last_offset - first_offset + 1); } // // Use this version of makeAnnotation when you have a range of // tokens to fold. // protected void makeFoldable(IToken first_token, IToken last_token) { if (last_token.getEndLine() > first_token.getLine()) { ILexStream lexStream = prsStream.getILexStream(); int start = first_token.getStartOffset(); int end = last_token.getEndOffset(); // Following may be necessary if one edits an empty source file; there // may be an AST with an empty textual extent, which causes Position() // a heartache. if (end <= start) { return; } while (end < lexStream.getStreamLength() && (lexStream.getCharValue(end) == ' ' || lexStream.getCharValue(end) == '\t')) { end++; } // For some reason, simply testing against Character.LINE_SEPARATOR here doesn't work. if (end < lexStream.getStreamLength()-1 && (lexStream.getCharValue(end+1) == '\n' || lexStream.getCharValue(end+1) == '\r')) { end++; } makeFoldableByOffsets(start, end); } } protected void makeFoldable(IAst n) { makeFoldable(n.getLeftIToken(), n.getRightIToken()); } protected void makeAdjunctsFoldable() { ILexStream lexStream = prsStream.getILexStream(); if (lexStream == null) return; List<IToken> adjuncts = prsStream.getAdjuncts(); for (int i = 0; i < adjuncts.size(); ) { Adjunct adjunct = (Adjunct) adjuncts.get(i); IToken previous_token = prsStream.getIToken(adjunct.getTokenIndex()), next_token = prsStream.getIToken(prsStream.getNext(previous_token.getTokenIndex())), comments[] = previous_token.getFollowingAdjuncts(); for (int k = 0; k < comments.length; k++) { Adjunct comment = (Adjunct) comments[k]; if (comment.getEndLine() > comment.getLine()) { IToken gate_token = k + 1 < comments.length ? comments[k + 1] : next_token; makeFoldableByOffsets(comment.getStartOffset(), gate_token.getLine() > comment.getEndLine() ? lexStream.getLineOffset(gate_token.getLine() - 1) : comment.getEndOffset()); } } i += comments.length; } } }