blob: 0413e624e908fdcebd2f6a2a23c373dc1a59d7b0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 xored software, Inc.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.tcl.internal.structure.builders;
import org.eclipse.dltk.compiler.IElementRequestor.ImportInfo;
import org.eclipse.dltk.tcl.ast.TclArgument;
import org.eclipse.dltk.tcl.ast.TclCommand;
import org.eclipse.dltk.tcl.structure.AbstractTclCommandModelBuilder;
import org.eclipse.dltk.tcl.structure.ITclModelBuildContext;
import org.eclipse.dltk.tcl.structure.TclProcessorUtil;
public class TclPackageModelBuilder extends AbstractTclCommandModelBuilder {
public boolean process(TclCommand command, ITclModelBuildContext context) {
if (command.getArguments().isEmpty()) {
return false;
}
final String subcmd = TclProcessorUtil.asString(command.getArguments()
.get(0));
if ("require".equals(subcmd)) {
return processRequire(command, context);
} else if ("provide".equals(subcmd)) {
return proccessProvide(command, context);
} else if ("ifneeded".equals(subcmd)) {
return processIfNeeded(command, context);
} else {
return false;
}
}
private boolean processRequire(TclCommand command,
ITclModelBuildContext context) {
int index = 1;
if (command.getArguments().size() <= index) {
return false;
}
TclArgument pkg = command.getArguments().get(index);
String packageName = TclProcessorUtil.asString(pkg);
if ("-exact".equals(packageName)) {
++index;
if (command.getArguments().size() <= index) {
return false;
}
pkg = command.getArguments().get(index);
packageName = TclProcessorUtil.asString(pkg);
}
final ImportInfo importInfo = new ImportInfo();
importInfo.sourceStart = pkg.getStart();
importInfo.sourceEnd = pkg.getEnd();
importInfo.containerName = org.eclipse.dltk.tcl.core.TclConstants.REQUIRE_CONTAINER;
importInfo.name = packageName;
if (command.getArguments().size() > index + 1) {
final TclArgument version = command.getArguments().get(index + 1);
importInfo.version = TclProcessorUtil.asString(version);
// importInfo.sourceEnd = version.getEnd();
}
--importInfo.sourceEnd;
context.getRequestor().acceptImport(importInfo);
return false;
}
private boolean proccessProvide(TclCommand command,
ITclModelBuildContext context) {
if (command.getArguments().size() < 2) {
return false;
}
TclArgument pkg = command.getArguments().get(1);
int start = pkg.getStart();
int end = pkg.getEnd();
String packageName = TclProcessorUtil.asString(pkg);
if (command.getArguments().size() > 2) {
TclArgument version = command.getArguments().get(2);
packageName += " (" + TclProcessorUtil.asString(version) + ")";
// end = version.getEnd();
}
context.getRequestor().acceptPackage(start, end - 1, packageName);
return false;
}
private boolean processIfNeeded(TclCommand command,
ITclModelBuildContext context) {
if (command.getArguments().size() < 2) {
return false;
}
TclArgument pkg = command.getArguments().get(1);
int start = pkg.getStart();
int end = pkg.getEnd();
String packageName = TclProcessorUtil.asString(pkg);
if (command.getArguments().size() > 2) {
TclArgument version = command.getArguments().get(2);
packageName += " (" + TclProcessorUtil.asString(version) + ")";
// end = version.getEnd();
}
context.getRequestor().acceptPackage(start, end - 1, packageName + "*");
return false;
}
}