/******************************************************************************
* Copyright (C) 2013 Fabio Zadrozny
*
* 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:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.shared_core.string;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitionerExtension2;
public abstract class BaseParsingUtils {
protected boolean throwSyntaxError;
public BaseParsingUtils(boolean throwSyntaxError) {
this.throwSyntaxError = throwSyntaxError;
}
/**
* Class that handles char[]
*
* @author Fabio
*/
private static final class FixedLenCharArrayParsingUtils extends BaseParsingUtils {
private final char[] cs;
private final int len;
public FixedLenCharArrayParsingUtils(char[] cs, boolean throwSyntaxError, int len) {
super(throwSyntaxError);
this.cs = cs;
this.len = len;
}
@Override
public int len() {
return len;
}
@Override
public char charAt(int i) {
return cs[i];
}
}
/**
* Class that handles FastStringBuffer
*
* @author Fabio
*/
private static final class FixedLenFastStringBufferParsingUtils extends BaseParsingUtils {
private final FastStringBuffer cs;
private final int len;
public FixedLenFastStringBufferParsingUtils(FastStringBuffer cs, boolean throwSyntaxError, int len) {
super(throwSyntaxError);
this.cs = cs;
this.len = len;
}
@Override
public int len() {
return len;
}
@Override
public char charAt(int i) {
return cs.charAt(i);
}
}
/**
* Class that handles StringBuffer
*
* @author Fabio
*/
private static final class FixedLenStringBufferParsingUtils extends BaseParsingUtils {
private final StringBuffer cs;
private final int len;
public FixedLenStringBufferParsingUtils(StringBuffer cs, boolean throwSyntaxError, int len) {
super(throwSyntaxError);
this.cs = cs;
this.len = len;
}
@Override
public int len() {
return len;
}
@Override
public char charAt(int i) {
return cs.charAt(i);
}
}
/**
* Class that handles String
*
* @author Fabio
*/
private static final class FixedLenStringParsingUtils extends BaseParsingUtils {
private final String cs;
private final int len;
public FixedLenStringParsingUtils(String cs, boolean throwSyntaxError, int len) {
super(throwSyntaxError);
this.cs = cs;
this.len = len;
}
@Override
public int len() {
return len;
}
@Override
public char charAt(int i) {
return cs.charAt(i);
}
}
/**
* Class that handles String
*
* @author Fabio
*/
private static final class FixedLenIDocumentParsingUtils extends BaseParsingUtils {
private final IDocument cs;
private final int len;
public FixedLenIDocumentParsingUtils(IDocument cs, boolean throwSyntaxError, int len) {
super(throwSyntaxError);
this.cs = cs;
this.len = len;
}
@Override
public int len() {
return len;
}
@Override
public char charAt(int i) {
try {
return cs.getChar(i);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
}
}
/**
* Class that handles FastStringBuffer
*
* @author Fabio
*/
private static final class FastStringBufferParsingUtils extends BaseParsingUtils {
private final FastStringBuffer cs;
public FastStringBufferParsingUtils(FastStringBuffer cs, boolean throwSyntaxError) {
super(throwSyntaxError);
this.cs = cs;
}
@Override
public int len() {
return cs.length();
}
@Override
public char charAt(int i) {
return cs.charAt(i);
}
}
/**
* Class that handles StringBuffer
*
* @author Fabio
*/
private static final class StringBufferParsingUtils extends BaseParsingUtils {
private final StringBuffer cs;
public StringBufferParsingUtils(StringBuffer cs, boolean throwSyntaxError) {
super(throwSyntaxError);
this.cs = cs;
}
@Override
public int len() {
return cs.length();
}
@Override
public char charAt(int i) {
return cs.charAt(i);
}
}
/**
* Class that handles String
*
* @author Fabio
*/
private static final class IDocumentParsingUtils extends BaseParsingUtils {
private final IDocument cs;
public IDocumentParsingUtils(IDocument cs, boolean throwSyntaxError) {
super(throwSyntaxError);
this.cs = cs;
}
@Override
public int len() {
return cs.getLength();
}
@Override
public char charAt(int i) {
try {
return cs.getChar(i);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
}
}
/**
* Factory method to create it (and by default doesn't throw any errors).
*/
public static BaseParsingUtils create(Object cs) {
return create(cs, false);
}
/**
* Factory method to create it. Object len may not be changed afterwards.
*/
public static BaseParsingUtils create(Object cs, boolean throwSyntaxError, int len) {
if (cs instanceof char[]) {
char[] cs2 = (char[]) cs;
return new FixedLenCharArrayParsingUtils(cs2, throwSyntaxError, len);
}
if (cs instanceof FastStringBuffer) {
FastStringBuffer cs2 = (FastStringBuffer) cs;
return new FixedLenFastStringBufferParsingUtils(cs2, throwSyntaxError, len);
}
if (cs instanceof StringBuffer) {
StringBuffer cs2 = (StringBuffer) cs;
return new FixedLenStringBufferParsingUtils(cs2, throwSyntaxError, len);
}
if (cs instanceof String) {
String cs2 = (String) cs;
return new FixedLenStringParsingUtils(cs2, throwSyntaxError, len);
}
if (cs instanceof IDocument) {
IDocument cs2 = (IDocument) cs;
return new FixedLenIDocumentParsingUtils(cs2, throwSyntaxError, len);
}
throw new RuntimeException("Don't know how to create instance for: " + cs.getClass());
}
/**
* Factory method to create it.
*/
public static BaseParsingUtils create(Object cs, boolean throwSyntaxError) {
if (cs instanceof char[]) {
char[] cs2 = (char[]) cs;
return new FixedLenCharArrayParsingUtils(cs2, throwSyntaxError, cs2.length);
}
if (cs instanceof FastStringBuffer) {
FastStringBuffer cs2 = (FastStringBuffer) cs;
return new FastStringBufferParsingUtils(cs2, throwSyntaxError);
}
if (cs instanceof StringBuffer) {
StringBuffer cs2 = (StringBuffer) cs;
return new StringBufferParsingUtils(cs2, throwSyntaxError);
}
if (cs instanceof String) {
String cs2 = (String) cs;
return new FixedLenStringParsingUtils(cs2, throwSyntaxError, cs2.length());
}
if (cs instanceof IDocument) {
IDocument cs2 = (IDocument) cs;
return new IDocumentParsingUtils(cs2, throwSyntaxError);
}
throw new RuntimeException("Don't know how to create instance for: " + cs.getClass());
}
//Abstract interfaces -------------------------------------------------------------
/**
* @return the char at a given position of the object
*/
public abstract char charAt(int i);
/**
* @return the length of the contained object
*/
public abstract int len();
public static String getContentType(IDocument document, int i) {
IDocumentPartitionerExtension2 extension = (IDocumentPartitionerExtension2) document.getDocumentPartitioner();
return extension.getContentType(i, true);
}
/**
* Finds the next char that matches the passed char. If not found, returns -1.
*/
public int findNextChar(int offset, char findChar) {
char c;
int l = len();
for (int i = offset; i < l; i++) {
c = charAt(i);
if (c == findChar) {
return i;
}
}
return -1;
}
}