blob: 45ba9d1989524f664d5f218c88cf00ae906efe12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 xored software, Inc. and others.
*
* 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:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.itcl.internal.core.parser.structure;
import org.eclipse.dltk.itcl.internal.core.parser.structure.model.IClass;
import org.eclipse.dltk.tcl.ast.TclCommand;
import org.eclipse.dltk.tcl.structure.ITclModelBuildContext;
import org.eclipse.dltk.tcl.structure.ITclModelBuilderDetector;
import org.eclipse.dltk.tcl.structure.TclModelBuilderUtil;
public class IncrTclModelDetector extends TclModelBuilderUtil implements ITclModelBuilderDetector {
private static final String[] NAMESPACES = new String[] { "::itcl::", "itcl::" };
private static final String[] COMMANDS = new String[] { "class", "body" };
// ,
// "code", "configbody", "delete", "ensemble", "find", "local",
// "scope"
private static final String PREFIX = "#itcl#"; //$NON-NLS-1$
private static final String ITCL_NEW_INSTANCE = PREFIX + "$newInstance"; //$NON-NLS-1$
/**
* Remove iTcl namespaces from the specified command name
*
* @param commandName
* @return command name without namespace
*/
private String normalize(String commandName) {
for (String namespace : NAMESPACES) {
if (commandName.startsWith(namespace)) {
return commandName.substring(namespace.length());
}
}
return commandName;
}
@Override
public String detect(String commandName, TclCommand command, ITclModelBuildContext context) {
if (commandName == null) {
return null;
}
commandName = normalize(commandName);
for (String cmd : COMMANDS) {
if (commandName.equals(cmd)) {
return PREFIX + cmd;
}
}
return checkInstanceOperations(command, commandName, context);
}
/**
* @param command
* @param commandName
* @param context
* @return
*/
private String checkInstanceOperations(TclCommand command, String commandName, ITclModelBuildContext context) {
final IncrTclNames names = IncrTclNames.get(context);
if (names != null) {
final IClass type = names.resolve(commandName);
if (type != null) {
IncrTclNames.saveType(context, type);
return ITCL_NEW_INSTANCE;
}
}
// TODO search global class list
return null;
}
}