Refactor PatternTranslator.

This commit is contained in:
pTalanov
2012-02-29 19:48:36 +04:00
parent 83a8c4263f
commit 0660140bf6
2 changed files with 40 additions and 25 deletions
@@ -22,6 +22,7 @@ import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.k2js.translate.context.TranslationContext;
@@ -31,6 +32,8 @@ import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
import static org.jetbrains.k2js.translate.utils.JsAstUtils.*;
import static org.jetbrains.k2js.translate.utils.PsiUtils.getPattern;
import static org.jetbrains.k2js.translate.utils.PsiUtils.getTypeReference;
/**
* @author Pavel Talanov
@@ -57,14 +60,6 @@ public final class PatternTranslator extends AbstractTranslator {
return resultingExpression;
}
//TODO: inspection
@NotNull
private JetPattern getPattern(@NotNull JetIsExpression expression) {
JetPattern pattern = expression.getPattern();
assert pattern != null : "Pattern should not be null";
return pattern;
}
@NotNull
public JsExpression translatePattern(@NotNull JetPattern pattern, @NotNull JsExpression expressionToMatch) {
if (pattern instanceof JetTypePattern) {
@@ -79,15 +74,16 @@ public final class PatternTranslator extends AbstractTranslator {
@NotNull
private JsExpression translateTypePattern(@NotNull JsExpression expressionToMatch,
@NotNull JetTypePattern pattern) {
//TODO: look into using intrinsics or other mechanisms to implement this logic
JsName className = getClassReference(pattern).getName();
if (className.getIdent().equals("String")) {
return typeof(expressionToMatch, program().getStringLiteral("string"));
}
if (className.getIdent().equals("Int")) {
return typeof(expressionToMatch, program().getStringLiteral("number"));
JsExpression result = translateAsIntrinsicTypeCheck(expressionToMatch, pattern);
if (result != null) {
return result;
}
return translateAsIsCheck(expressionToMatch, pattern);
}
@NotNull
private JsExpression translateAsIsCheck(@NotNull JsExpression expressionToMatch,
@NotNull JetTypePattern pattern) {
JsInvocation isCheck = AstUtil.newInvocation(context().namer().isOperationReference(),
expressionToMatch, getClassReference(pattern));
if (isNullable(pattern)) {
@@ -96,14 +92,27 @@ public final class PatternTranslator extends AbstractTranslator {
return isCheck;
}
@Nullable
private JsExpression translateAsIntrinsicTypeCheck(@NotNull JsExpression expressionToMatch,
@NotNull JetTypePattern pattern) {
JsExpression result = null;
JsName className = getClassReference(pattern).getName();
if (className.getIdent().equals("String")) {
result = typeof(expressionToMatch, program().getStringLiteral("string"));
}
if (className.getIdent().equals("Int")) {
result = typeof(expressionToMatch, program().getStringLiteral("number"));
}
return result;
}
@NotNull
private JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) {
return or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck);
}
private boolean isNullable(JetTypePattern pattern) {
return BindingUtils.getTypeByReference(bindingContext(),
getTypeReference(pattern)).isNullable();
return BindingUtils.getTypeByReference(bindingContext(), getTypeReference(pattern)).isNullable();
}
@NotNull
@@ -112,14 +121,6 @@ public final class PatternTranslator extends AbstractTranslator {
return getClassNameReferenceForTypeReference(typeReference);
}
//TODO: inspection: util?
@NotNull
private JetTypeReference getTypeReference(@NotNull JetTypePattern pattern) {
JetTypeReference typeReference = pattern.getTypeReference();
assert typeReference != null : "Type pattern should contain a type reference";
return typeReference;
}
@NotNull
private JsNameRef getClassNameReferenceForTypeReference(@NotNull JetTypeReference typeReference) {
ClassDescriptor referencedClass = BindingUtils.getClassDescriptorForTypeReference
@@ -160,4 +160,18 @@ public final class PsiUtils {
assert rangeExpression != null;
return rangeExpression;
}
@NotNull
public static JetPattern getPattern(@NotNull JetIsExpression expression) {
JetPattern pattern = expression.getPattern();
assert pattern != null : "Pattern should not be null";
return pattern;
}
@NotNull
public static JetTypeReference getTypeReference(@NotNull JetTypePattern pattern) {
JetTypeReference typeReference = pattern.getTypeReference();
assert typeReference != null : "Type pattern should contain a type reference";
return typeReference;
}
}