package org.eclipse.dltk.ruby.ast; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ast.references.ConstantReference; import org.eclipse.dltk.ast.references.Reference; import org.eclipse.dltk.ruby.core.RubyPlugin; /** * @author ssanders */ public class RubyASTUtil { private RubyASTUtil() { } public static String resolveClassName(ASTNode node) { String className = ""; //$NON-NLS-1$ if (node instanceof Reference) { className = ((Reference) node).getStringRepresentation(); } else if (node instanceof RubyColonExpression) { RubyColonExpression rcExp = (RubyColonExpression) node; if (rcExp.getLeft() != null) { className = resolveClassName(rcExp.getLeft()); className += "::"; //$NON-NLS-1$ } className += rcExp.getName(); } return className; } /** * @param value * @param sb */ private static boolean collectColonExpression(RubyColonExpression value, StringBuffer sb) { final ASTNode left = value.getLeft(); if (left instanceof RubyColonExpression) { if (!collectColonExpression((RubyColonExpression) left, sb)) { return false; } } else if (left instanceof ConstantReference) { sb.append(((ConstantReference) left).getName()); } else if (left != null) { final String msg = "Unexpected node in colon-expression " + left.getClass().getName(); //$NON-NLS-1$ RubyPlugin.log(msg); return false; } if (sb.length() != 0) { sb.append("::"); //$NON-NLS-1$ } sb.append(value.getName()); return true; } /** * Resolves type name reference (Const or ModuleName::Const). Returns the * full resolved type name or <code>null</code>. * * @param value * @return */ public static String resolveReference(ASTNode value) { if (value instanceof ConstantReference) { return ((ConstantReference) value).getName(); } if (value instanceof RubyColonExpression) { final StringBuffer sb = new StringBuffer(); if (collectColonExpression((RubyColonExpression) value, sb)) { return sb.toString(); } } return null; } /** * Resolves type name reference (Const or ModuleName::Const). Returns the * simple resolved type name or <code>null</code>. * * @param value * @return */ public static String resolveReferenceSimpleName(ASTNode value) { if (value instanceof ConstantReference) { return ((ConstantReference) value).getName(); } if (value instanceof RubyColonExpression) { return ((RubyColonExpression) value).getName(); } return null; } }