/**
* Copyright (c) 2015 by Brainwy Software Ltda. 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.
*/
package org.python.pydev.core.partition;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.python.pydev.core.IPythonPartitions;
import org.python.pydev.shared_core.partitioner.CustomRuleBasedPartitionScanner;
/**
* This class should partition Python files in major partitions (code, strings, unicode, comments, backquotes)
*/
public class AbstractPyPartitionScanner extends CustomRuleBasedPartitionScanner implements IPythonPartitions {
private final Token multiLineBytesToken1;
private final Token multiLineBytesToken2;
private final Token multiLineUnicodeToken1;
private final Token multiLineUnicodeToken2;
private final Token singleLineUnicodeToken1;
private final Token singleLineUnicodeToken2;
private final Token singleLineBytesToken1;
private final Token singleLineBytesToken2;
private Token singleLineBytesOrUnicodeToken1;
private Token singleLineBytesOrUnicodeToken2;
private Token multiLineBytesOrUnicodeToken1;
private Token multiLineBytesOrUnicodeToken2;
private Token singleLineFStringToken1;
private Token singleLineFStringToken2;
private Token multiLineFStringToken1;
private Token multiLineFStringToken2;
/**
* Note: the formats supported for strings are:
*
* br''
* b''
* ur''
* u''
* r''
* ''
*
* For matching only unicode we care about:
*
* u''
* ur''
*
* For matching only bytes we care about:
*
* b''
* br''
*
* For matching dependent on defaultIsUnicode we care about:
*
* ''
* r''
*
*/
public AbstractPyPartitionScanner() {
IPredicateRule reprRule = new SingleLineRule("`", "`", new Token(IPythonPartitions.PY_BACKQUOTES));
// Single Line
singleLineUnicodeToken1 = new Token(IPythonPartitions.PY_SINGLELINE_UNICODE1);
singleLineUnicodeToken2 = new Token(IPythonPartitions.PY_SINGLELINE_UNICODE2);
singleLineBytesToken1 = new Token(IPythonPartitions.PY_SINGLELINE_BYTES1);
singleLineBytesToken2 = new Token(IPythonPartitions.PY_SINGLELINE_BYTES2);
singleLineFStringToken1 = new Token(IPythonPartitions.PY_SINGLELINE_FSTRING1);
singleLineFStringToken2 = new Token(IPythonPartitions.PY_SINGLELINE_FSTRING2);
singleLineBytesOrUnicodeToken1 = new Token(IPythonPartitions.PY_SINGLELINE_BYTES_OR_UNICODE1);
singleLineBytesOrUnicodeToken2 = new Token(IPythonPartitions.PY_SINGLELINE_BYTES_OR_UNICODE2);
// boolean breaksOnEOL = true;
// boolean breaksOnEOF = false;
// boolean escapeContinuesLine = true;
// IPredicateRule singlelineUnicodeRule1 = new PatternRule("'", "'", singleLineUnicodeToken1, '\\', breaksOnEOL,
// breaksOnEOF, escapeContinuesLine);
// IPredicateRule singlelineUnicodeRule2 = new PatternRule("\"", "\"", singleLineUnicodeToken2, '\\', breaksOnEOL,
// breaksOnEOF, escapeContinuesLine);
SingleLineRuleWithMultipleStarts singlelineFString1 = new SingleLineRuleWithMultipleStarts(
new String[] { "f'", "fr'" }, "'", singleLineFStringToken1, '\\', true);
SingleLineRuleWithMultipleStarts singlelineFString2 = new SingleLineRuleWithMultipleStarts(
new String[] { "f\"", "fr\"" }, "\"", singleLineFStringToken2, '\\', true);
SingleLineRuleWithMultipleStarts singlelineBytes1 = new SingleLineRuleWithMultipleStarts(
new String[] { "b'", "br'" }, "'", singleLineBytesToken1, '\\', true);
SingleLineRuleWithMultipleStarts singlelineBytes2 = new SingleLineRuleWithMultipleStarts(
new String[] { "b\"", "br\"" }, "\"", singleLineBytesToken2, '\\', true);
SingleLineRuleWithMultipleStarts singlelineUnicode1 = new SingleLineRuleWithMultipleStarts(
new String[] { "u\'", "ur\'" }, "'", singleLineUnicodeToken1, '\\', true);
SingleLineRuleWithMultipleStarts singlelineUnicode2 = new SingleLineRuleWithMultipleStarts(
new String[] { "u\"", "ur\"" }, "\"", singleLineUnicodeToken2, '\\', true);
SingleLineRuleWithMultipleStarts singlelineBytesOrUnicode1 = new SingleLineRuleWithMultipleStarts(
new String[] { "\'", "r\'" }, "'", singleLineBytesOrUnicodeToken1, '\\', true);
SingleLineRuleWithMultipleStarts singlelineBytesOrUnicode2 = new SingleLineRuleWithMultipleStarts(
new String[] { "\"", "r\"" }, "\"", singleLineBytesOrUnicodeToken2, '\\', true);
// multiline
multiLineBytesToken1 = new Token(IPythonPartitions.PY_MULTILINE_BYTES1);
multiLineBytesToken2 = new Token(IPythonPartitions.PY_MULTILINE_BYTES2);
multiLineFStringToken1 = new Token(IPythonPartitions.PY_MULTILINE_FSTRING1);
multiLineFStringToken2 = new Token(IPythonPartitions.PY_MULTILINE_FSTRING2);
multiLineUnicodeToken1 = new Token(IPythonPartitions.PY_MULTILINE_UNICODE1);
multiLineUnicodeToken2 = new Token(IPythonPartitions.PY_MULTILINE_UNICODE2);
multiLineBytesOrUnicodeToken1 = new Token(IPythonPartitions.PY_MULTILINE_BYTES_OR_UNICODE1);
multiLineBytesOrUnicodeToken2 = new Token(IPythonPartitions.PY_MULTILINE_BYTES_OR_UNICODE2);
// deal with ''' and """ strings
// breaksOnEOF = true;
//If we don't add breaksOnEOF = true it won't properly recognize the rule while typing
//in the following case:
///'''<new line>
//text
//''' <-- it's already lost at this point and the 'text' will not be in a multiline string partition.
// IPredicateRule multilineBytes1 = new MultiLineRule("'''", "'''", multiLineBytesToken1, '\\', breaksOnEOF);
// IPredicateRule multilineBytes2 = new MultiLineRule("\"\"\"", "\"\"\"", multiLineBytesToken2, '\\', breaksOnEOF);
MultiLineRuleWithMultipleStarts multilineFString1 = new MultiLineRuleWithMultipleStarts(
new String[] { "f'''", "fr'''" }, "'''", multiLineFStringToken1, '\\');
MultiLineRuleWithMultipleStarts multilineFString2 = new MultiLineRuleWithMultipleStarts(
new String[] { "f\"\"\"", "fr\"\"\"" }, "\"\"\"", multiLineFStringToken2, '\\');
MultiLineRuleWithMultipleStarts multilineBytes1 = new MultiLineRuleWithMultipleStarts(
new String[] { "b'''", "br'''" }, "'''", multiLineBytesToken1, '\\');
MultiLineRuleWithMultipleStarts multilineBytes2 = new MultiLineRuleWithMultipleStarts(
new String[] { "b\"\"\"", "br\"\"\"" }, "\"\"\"", multiLineBytesToken2, '\\');
MultiLineRuleWithMultipleStarts multilineUnicode1 = new MultiLineRuleWithMultipleStarts(
new String[] { "u'''", "ur'''" }, "'''", multiLineUnicodeToken1, '\\');
MultiLineRuleWithMultipleStarts multilineUnicode2 = new MultiLineRuleWithMultipleStarts(
new String[] { "u\"\"\"", "ur\"\"\"" }, "\"\"\"", multiLineUnicodeToken2, '\\');
MultiLineRuleWithMultipleStarts multilineBytesOrUnicode1 = new MultiLineRuleWithMultipleStarts(
new String[] { "'''", "r'''" }, "'''", multiLineBytesOrUnicodeToken1, '\\');
MultiLineRuleWithMultipleStarts multilineBytesOrUnicode2 = new MultiLineRuleWithMultipleStarts(
new String[] { "\"\"\"", "r\"\"\"" }, "\"\"\"", multiLineBytesOrUnicodeToken2, '\\');
IPredicateRule commentRule = new EndOfLineRule("#", new Token(IPythonPartitions.PY_COMMENT));
setPredicateRules(new IPredicateRule[] {
reprRule,
multilineFString1,
multilineFString2,
multilineBytes1,
multilineBytes2,
multilineUnicode1,
multilineUnicode2,
multilineBytesOrUnicode1,
multilineBytesOrUnicode2,
//Note: the order is important (so, single lines after multi lines)
singlelineFString1,
singlelineFString2,
singlelineBytes1,
singlelineBytes2,
singlelineUnicode1,
singlelineUnicode2,
singlelineBytesOrUnicode1,
singlelineBytesOrUnicode2,
commentRule
});
}
}