package com.jetbrains.lang.dart.ide.info;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.lang.dart.psi.DartComponent;
import com.jetbrains.lang.dart.psi.DartDefaultFormalNamedParameter;
import com.jetbrains.lang.dart.psi.DartFormalParameterList;
import com.jetbrains.lang.dart.psi.DartOptionalFormalParameters;
import com.jetbrains.lang.dart.util.DartGenericSpecialization;
import com.jetbrains.lang.dart.util.DartPresentableUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class DartOptionalParameterDescription {
private final String myText;
@Nullable
private final String myValue;
private boolean myIsPositional;
public DartOptionalParameterDescription(@NotNull String text, @Nullable String value, boolean isPositional) {
myText = text;
myValue = value;
myIsPositional = isPositional;
}
public static DartOptionalParameterDescription[] getParameters(DartComponent element, DartGenericSpecialization specialization) {
final DartFormalParameterList parameterList = PsiTreeUtil.getChildOfType(element, DartFormalParameterList.class);
final DartOptionalFormalParameters optionalFormalParameters =
parameterList == null ? null : parameterList.getOptionalFormalParameters();
if (optionalFormalParameters == null) {
return new DartOptionalParameterDescription[0];
}
final List<DartDefaultFormalNamedParameter> list = optionalFormalParameters.getDefaultFormalNamedParameterList();
final DartOptionalParameterDescription[] result = new DartOptionalParameterDescription[list.size()];
for (int i = 0, size = list.size(); i < size; i++) {
final DartDefaultFormalNamedParameter formalNamedParameter = list.get(i);
final String normalFormalParameter =
DartPresentableUtil.getPresentableNormalFormalParameter(formalNamedParameter.getNormalFormalParameter(), specialization);
final PsiElement valueElement = formalNamedParameter.getExpression();
result[i] =
new DartOptionalParameterDescription(normalFormalParameter, valueElement == null ? null : valueElement.getText(), isPositional(
formalNamedParameter));
}
return result;
}
private static boolean isPositional(final DartDefaultFormalNamedParameter parameter) {
final DartOptionalFormalParameters formalParameters = PsiTreeUtil.getParentOfType(parameter, DartOptionalFormalParameters.class);
if (formalParameters == null) {
return false;
}
final PsiElement firstChild = formalParameters.getFirstChild();
return firstChild != null && "[".equals(firstChild.getText());
}
@Override
public String toString() {
if (myValue == null) return myText;
return myText + (isPositional() ? " = " : ": ") + myValue;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DartOptionalParameterDescription that = (DartOptionalParameterDescription)o;
if (myText.equals(that.myText)) return false;
return true;
}
@Override
public int hashCode() {
return myText.hashCode();
}
public boolean isPositional() {
return myIsPositional;
}
}