package com.redhat.ceylon.eclipse.util; import static java.util.regex.Pattern.compile; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.text.Region; import com.redhat.ceylon.compiler.typechecker.tree.Tree.DocLink; public class DocLinks { private static final Pattern packagePattern = compile("^([^|]*\\|)?([^:]*)::"); private static final Pattern namePattern = compile("^([^|]*\\|)?([^:]*::)?(.*)"); public static boolean hasPackage(DocLink docLink) { return docLink.getText().contains("::"); } public static Region packageRegion(DocLink docLink) { Matcher matcher = packagePattern.matcher(docLink.getText()); if (matcher.find()) { int offset = docLink.getStartIndex(); return new Region(offset+matcher.start(2), matcher.end(2)); } else { return null; } } public static String packageName(DocLink docLink) { Matcher matcher = packagePattern.matcher(docLink.getText()); if (matcher.find()) { return matcher.group(2); } else { return null; } } public static Region nameRegion(DocLink docLink, int i) { Matcher matcher = namePattern.matcher(docLink.getText()); if (matcher.find()) { String path = matcher.group(3); int start = matcher.start(3); int startIndex = 0; for (int j=0; j<i; j++) { startIndex = path.indexOf('.', startIndex)+1; if (startIndex==0) { return null; } } int stopIndex = path.indexOf('.', startIndex); if (stopIndex<0) stopIndex = path.length(); int offset = docLink.getStartIndex(); return new Region(offset+start+startIndex, stopIndex-startIndex); } else { return null; } } public static String name(DocLink docLink, int i) { Matcher matcher = namePattern.matcher(docLink.getText()); if (matcher.find()) { String path = matcher.group(3); int startIndex = 0; for (int j=0; j<i; j++) { startIndex = path.indexOf('.', startIndex)+1; if (startIndex==0) { return null; } } int stopIndex = path.indexOf('.', startIndex); if (stopIndex<0) stopIndex = path.length(); return path.substring(startIndex, stopIndex); } else { return null; } } }