From 0660140bf608ef0f267fe6cb3595fbad4f386fe4 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Wed, 29 Feb 2012 19:48:36 +0400 Subject: [PATCH] Refactor PatternTranslator. --- .../expression/PatternTranslator.java | 51 ++++++++++--------- .../k2js/translate/utils/PsiUtils.java | 14 +++++ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java index 73401186594..77ed901a1ff 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java @@ -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 diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java index 1625d013acb..d5af36f24f7 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java @@ -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; + } }