blob: a75887aba711fb09525646bbfbada53df539620f [file] [log] [blame]
package com.jetbrains.python.debugger;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author traff
*/
public class PySignature {
private final String myFile;
private final String myFunctionName;
private final List<NamedParameter> myArgs = Lists.newArrayList();
public PySignature(@NotNull String file, @NotNull String name) {
myFile = file;
myFunctionName = name;
}
@Nullable
public String getArgTypeQualifiedName(@NotNull String name) {
for (NamedParameter param : myArgs) {
if (name.equals(param.getName())) {
return param.getTypeQualifiedName();
}
}
return null;
}
@NotNull
public String getFile() {
return myFile;
}
@NotNull
public String getFunctionName() {
return myFunctionName;
}
@NotNull
public List<NamedParameter> getArgs() {
return myArgs;
}
@NotNull
public PySignature addAllArgs(@NotNull PySignature signature) {
for (NamedParameter param : signature.getArgs()) {
NamedParameter ourParam = getArgForName(param.getName());
if (ourParam != null) {
ourParam.addTypes(param.getTypesList());
}
else {
addArgument(param);
}
}
return this;
}
@Nullable
private NamedParameter getArgForName(String name) {
for (NamedParameter param : myArgs) {
if (param.getName().equals(name)) {
return param;
}
}
return null;
}
public static class NamedParameter {
private final String myName;
private final List<String> myTypes;
private NamedParameter(@NotNull String name, @NotNull String type) {
myName = name;
myTypes = parseTypes(type);
}
@NotNull
private static List<String> parseTypes(@NotNull String type) {
String[] parts = type.split(" or ");
return Lists.newArrayList(parts);
}
public String getName() {
return myName;
}
public String getTypeQualifiedName() {
if (myTypes.size() == 1) {
return myTypes.get(0);
}
else {
return StringUtil.join(myTypes, " or ");
}
}
public void addType(String type) {
if (!myTypes.contains(type)) {
myTypes.add(type);
}
}
public void addTypes(List<String> newTypes) {
for (String type : newTypes) {
addType(type);
}
}
public List<String> getTypesList() {
return myTypes;
}
}
public PySignature addArgument(String name, String type) {
return addArgument(new NamedParameter(name, type));
}
public PySignature addArgument(NamedParameter argument) {
myArgs.add(argument);
return this;
}
}