Refactor PatternTranslator.
This commit is contained in:
+26
-25
@@ -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.backend.js.ast.JsNameRef;
|
||||||
import com.google.dart.compiler.util.AstUtil;
|
import com.google.dart.compiler.util.AstUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
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 org.jetbrains.k2js.translate.utils.TranslationUtils;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.*;
|
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
|
* @author Pavel Talanov
|
||||||
@@ -57,14 +60,6 @@ public final class PatternTranslator extends AbstractTranslator {
|
|||||||
return resultingExpression;
|
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
|
@NotNull
|
||||||
public JsExpression translatePattern(@NotNull JetPattern pattern, @NotNull JsExpression expressionToMatch) {
|
public JsExpression translatePattern(@NotNull JetPattern pattern, @NotNull JsExpression expressionToMatch) {
|
||||||
if (pattern instanceof JetTypePattern) {
|
if (pattern instanceof JetTypePattern) {
|
||||||
@@ -79,15 +74,16 @@ public final class PatternTranslator extends AbstractTranslator {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression translateTypePattern(@NotNull JsExpression expressionToMatch,
|
private JsExpression translateTypePattern(@NotNull JsExpression expressionToMatch,
|
||||||
@NotNull JetTypePattern pattern) {
|
@NotNull JetTypePattern pattern) {
|
||||||
//TODO: look into using intrinsics or other mechanisms to implement this logic
|
JsExpression result = translateAsIntrinsicTypeCheck(expressionToMatch, pattern);
|
||||||
JsName className = getClassReference(pattern).getName();
|
if (result != null) {
|
||||||
if (className.getIdent().equals("String")) {
|
return result;
|
||||||
return typeof(expressionToMatch, program().getStringLiteral("string"));
|
|
||||||
}
|
|
||||||
if (className.getIdent().equals("Int")) {
|
|
||||||
return typeof(expressionToMatch, program().getStringLiteral("number"));
|
|
||||||
}
|
}
|
||||||
|
return translateAsIsCheck(expressionToMatch, pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private JsExpression translateAsIsCheck(@NotNull JsExpression expressionToMatch,
|
||||||
|
@NotNull JetTypePattern pattern) {
|
||||||
JsInvocation isCheck = AstUtil.newInvocation(context().namer().isOperationReference(),
|
JsInvocation isCheck = AstUtil.newInvocation(context().namer().isOperationReference(),
|
||||||
expressionToMatch, getClassReference(pattern));
|
expressionToMatch, getClassReference(pattern));
|
||||||
if (isNullable(pattern)) {
|
if (isNullable(pattern)) {
|
||||||
@@ -96,14 +92,27 @@ public final class PatternTranslator extends AbstractTranslator {
|
|||||||
return isCheck;
|
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
|
@NotNull
|
||||||
private JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) {
|
private JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) {
|
||||||
return or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck);
|
return or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isNullable(JetTypePattern pattern) {
|
private boolean isNullable(JetTypePattern pattern) {
|
||||||
return BindingUtils.getTypeByReference(bindingContext(),
|
return BindingUtils.getTypeByReference(bindingContext(), getTypeReference(pattern)).isNullable();
|
||||||
getTypeReference(pattern)).isNullable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -112,14 +121,6 @@ public final class PatternTranslator extends AbstractTranslator {
|
|||||||
return getClassNameReferenceForTypeReference(typeReference);
|
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
|
@NotNull
|
||||||
private JsNameRef getClassNameReferenceForTypeReference(@NotNull JetTypeReference typeReference) {
|
private JsNameRef getClassNameReferenceForTypeReference(@NotNull JetTypeReference typeReference) {
|
||||||
ClassDescriptor referencedClass = BindingUtils.getClassDescriptorForTypeReference
|
ClassDescriptor referencedClass = BindingUtils.getClassDescriptorForTypeReference
|
||||||
|
|||||||
@@ -160,4 +160,18 @@ public final class PsiUtils {
|
|||||||
assert rangeExpression != null;
|
assert rangeExpression != null;
|
||||||
return rangeExpression;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user