/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.tvl.goworks.editor.go.quicksearch;
import java.util.Collection;
import org.tvl.goworks.editor.go.codemodel.CodeElementModel;
import org.tvl.goworks.editor.go.codemodel.ConstModel;
import org.tvl.goworks.editor.go.codemodel.FieldModel;
import org.tvl.goworks.editor.go.codemodel.FileModel;
import org.tvl.goworks.editor.go.codemodel.FunctionModel;
import org.tvl.goworks.editor.go.codemodel.ParameterModel;
import org.tvl.goworks.editor.go.codemodel.TypeFunctionModel;
import org.tvl.goworks.editor.go.codemodel.VarModel;
import org.tvl.goworks.editor.go.codemodel.formatters.BaseCodeModelFormatter;
import org.tvl.goworks.editor.go.codemodel.impl.AbstractCodeElementModel;
/**
*
* @author Sam Harwell
*/
public abstract class QuickSearchFormatter extends BaseCodeModelFormatter {
public static final QuickSearchFormatter INSTANCE = new TopLevelQuickSearchFormatter();
private static final TopLevelElementQuickSearchFormatter TOP_LEVEL_ELEMENT = new TopLevelElementQuickSearchFormatter();
private static final ParameterFormatter PARAM = new ParameterFormatter();
private QuickSearchFormatter() {
}
protected void formatParameters(StringBuilder builder, Collection<? extends ParameterModel> parameters) {
builder.append('(');
boolean first = true;
for (ParameterModel parameter : parameters) {
if (!first) {
builder.append(", ");
}
first = false;
builder.append(PARAM.format(parameter));
}
builder.append(')');
}
private static class TopLevelQuickSearchFormatter extends QuickSearchFormatter {
@Override
public String format(CodeElementModel model) {
StringBuilder builder = new StringBuilder();
builder.append(TOP_LEVEL_ELEMENT.format(model));
if (model instanceof AbstractCodeElementModel) {
AbstractCodeElementModel abstractModel = (AbstractCodeElementModel)model;
FileModel fileModel = abstractModel.getFile();
if (fileModel != null && !fileModel.equals(model)) {
builder.append(" in ");
builder.append(fileModel.getName());
}
}
return builder.toString();
}
}
private static class TopLevelElementQuickSearchFormatter extends QuickSearchFormatter {
@Override
protected String formatFunctionModel(FunctionModel model) {
StringBuilder builder = new StringBuilder(model.getName());
formatParameters(builder, model.getParameters());
return builder.toString();
}
@Override
protected String formatFieldModel(FieldModel model) {
return format(model.getVarType()) + ' ' + model.getName();
}
@Override
protected String formatVarModel(VarModel model) {
return format(model.getVarType()) + ' ' + model.getName();
}
@Override
protected String formatParameterModel(ParameterModel model) {
throw new UnsupportedOperationException();
}
@Override
protected String formatTypeFunctionModel(TypeFunctionModel model) {
throw new UnsupportedOperationException();
}
}
private static class ParameterFormatter extends QuickSearchFormatter {
@Override
protected String formatTypeFunctionModel(TypeFunctionModel model) {
StringBuilder builder = new StringBuilder("func ");
formatParameters(builder, model.getParameters());
if (!model.getReturnValues().isEmpty()) {
builder.append(' ');
formatParameters(builder, model.getReturnValues());
}
return builder.toString();
}
@Override
protected String formatParameterModel(ParameterModel model) {
return format(model.getVarType());
}
@Override
protected String formatConstModel(ConstModel model) {
throw new UnsupportedOperationException();
}
@Override
protected String formatFileModel(FileModel model) {
throw new UnsupportedOperationException();
}
@Override
protected String formatFunctionModel(FunctionModel model) {
throw new UnsupportedOperationException();
}
@Override
protected String formatFieldModel(FieldModel model) {
throw new UnsupportedOperationException();
}
@Override
protected String formatVarModel(VarModel model) {
throw new UnsupportedOperationException();
}
}
}