/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Author: atotic * Created: July 10, 2003 */ package org.python.pydev.core.partition; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IDocumentPartitioner; import org.python.pydev.core.IGrammarVersionProvider; import org.python.pydev.core.IPythonPartitions; import org.python.pydev.core.log.Log; /** * Rule-based partition scanner * * Simple, fast parsing of the document into partitions.<p> * This is like a rough 1st pass at parsing. We only parse * out for comments, single-line strings, and multiline strings<p> * The results are parsed again inside {@link org.python.pydev.editor.PyEditConfiguration#getPresentationReconciler} * and colored there.<p> * * "An IPartitionTokenScanner can also start in the middle of a partition, * if it knows the type of the partition." */ public class PyPartitionScanner extends AbstractPyPartitionScanner { public PyPartitionScanner() { super(); } /** * @return all types recognized by this scanner (used by doc partitioner) */ static public String[] getTypes() { return IPythonPartitions.types; } public static IDocumentPartitioner checkPartitionScanner(IDocument document) { return checkPartitionScanner(document, null); } /** * Checks if the partitioner is correctly set in the document. * @return the partitioner that is set in the document */ public static IDocumentPartitioner checkPartitionScanner(IDocument document, IGrammarVersionProvider grammarVersionProvider) { if (document == null) { return null; } IDocumentExtension3 docExtension = (IDocumentExtension3) document; IDocumentPartitioner partitioner = docExtension.getDocumentPartitioner(IPythonPartitions.PYTHON_PARTITION_TYPE); if (partitioner == null) { addPartitionScanner(document, grammarVersionProvider); //get it again for the next check partitioner = docExtension.getDocumentPartitioner(IPythonPartitions.PYTHON_PARTITION_TYPE); } if (!(partitioner instanceof PyPartitioner)) { Log.log("Partitioner should be subclass of PyPartitioner. It is " + partitioner.getClass()); } return partitioner; } /** * @see http://help.eclipse.org/help31/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/editors_documents.htm * @see http://jroller.com/page/bobfoster - Saturday July 16, 2005 * @param document the document where we want to add the partitioner * @return the added document partitioner (or null) */ public static IDocumentPartitioner addPartitionScanner(IDocument document, IGrammarVersionProvider grammarVersionProvider) { if (document != null) { IDocumentExtension3 docExtension = (IDocumentExtension3) document; IDocumentPartitioner curr = docExtension.getDocumentPartitioner(IPythonPartitions.PYTHON_PARTITION_TYPE); if (curr == null) { //set the new one PyPartitioner partitioner = createPyPartitioner(); partitioner.connect(document); docExtension.setDocumentPartitioner(IPythonPartitions.PYTHON_PARTITION_TYPE, partitioner); return partitioner; } else { return curr; } } return null; } public static PyPartitioner createPyPartitioner() { return new PyPartitioner(new PyPartitionScanner(), getTypes()); } }