/******************************************************************************* * Copyright (c) 2012 Pivotal Software, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.grails.ide.eclipse.editor.gsp.parser; import java.util.Iterator; import java.util.List; import org.eclipse.jst.jsp.core.internal.parser.JSPSourceParser; import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer; import org.eclipse.wst.sse.core.internal.ltk.parser.RegionParser; import org.eclipse.wst.sse.core.internal.ltk.parser.TagMarker; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; /** * @author Andrew Eisenberg * @created Dec 4, 2009 */ public class GSPSourceParser extends JSPSourceParser { /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ protected class GSPNestablePrefixHandler extends NestablePrefixHandler { protected void enableForTaglib(String prefix, IStructuredDocumentRegion anchorFlatNode) { if (prefix == null) return; List<TagMarker> tagmarkers = ((GSPTokenizer) getTokenizer()).getNestablePrefixes(); for (int i = 0; i < tagmarkers.size(); i++) { if (tagmarkers.get(i).getTagName().equals(prefix)) return; } ((GSPTokenizer) getTokenizer()).getNestablePrefixes().add(new TagMarker(prefix, anchorFlatNode)); } public void resetNodes() { Iterator<TagMarker> tagmarkers = ((GSPTokenizer) getTokenizer()).getNestablePrefixes().iterator(); while (tagmarkers.hasNext()) { if (!tagmarkers.next().isGlobal()) tagmarkers.remove(); } } } /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ @SuppressWarnings("deprecation") @Override protected BlockTokenizer getTokenizer() { if (fTokenizer == null) { fTokenizer = new GSPTokenizer(); getStructuredDocumentRegionHandlers().add(new GSPNestablePrefixHandler()); } return fTokenizer; } /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ public void addNestablePrefix(TagMarker marker) { ((GSPTokenizer) getTokenizer()).addNestablePrefix(marker); } public void removeNestablePrefix(TagMarker marker) { List<TagMarker> prefixes = getNestablePrefixes(); for (Iterator<TagMarker> iterator = prefixes.iterator(); iterator.hasNext();) { TagMarker prefix = iterator.next(); if (prefix.getTagName().equals(marker.getTagName())) { iterator.remove(); break; } } } /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ public List<TagMarker> getNestablePrefixes() { return ((GSPTokenizer) getTokenizer()).getNestablePrefixes(); } /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ public void removeNestablePrefix(String tagName) { ((GSPTokenizer) getTokenizer()).removeNestablePrefix(tagName); } /** * Override so that references are to GSPTokenizer, not JSPTokenizer */ public RegionParser newInstance() { GSPSourceParser newInstance = new GSPSourceParser(); newInstance.setTokenizer(getTokenizer().newInstance()); return newInstance; } }