Skip to content

Commit

Permalink
Proivde var name completion from extract()
Browse files Browse the repository at this point in the history
  • Loading branch information
klesun committed Nov 15, 2018
1 parent 17b392d commit 2197a04
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,34 +11,26 @@
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceService;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.util.ProcessingContext;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.PhpCallbackReferenceBase;
import com.jetbrains.php.lang.findUsages.PhpFindUsagesConfiguration;
import com.jetbrains.php.lang.psi.elements.*;
import com.jetbrains.php.lang.psi.elements.impl.BinaryExpressionImpl;
import com.jetbrains.php.lang.psi.elements.impl.VariableImpl;
import com.jetbrains.php.lang.psi.resolve.types.PhpType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.klesun.deep_assoc_completion.DeepType;
import org.klesun.deep_assoc_completion.helpers.*;
import org.klesun.deep_assoc_completion.resolvers.FuncCallRes;
import org.klesun.deep_assoc_completion.resolvers.VarRes;
import org.klesun.deep_assoc_completion.resolvers.var_res.AssRes;
import org.klesun.lang.It;
import org.klesun.lang.L;
import org.klesun.lang.MemoizingIterable;
import org.klesun.lang.Tls;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;

import static org.klesun.lang.Lang.*;

Expand Down Expand Up @@ -91,6 +83,37 @@ private static It<DeepType> resolveGlobalsMagicVar(IExprCtx funcCtx, Variable ca
.wap(asses -> AssRes.assignmentsToTypes(asses));
}

private static It<FunctionReference> getCalsBefore(Variable caretVar)
{
return Tls.findParent(caretVar, Function.class, a -> true)
.fap(meth -> Tls.findChildren(
meth.getLastChild(),
FunctionReference.class,
subPsi -> !(subPsi instanceof Function) &&
subPsi.getTextOffset() < caretVar.getTextOffset()
));
}

private static It<DeepType> resolveExtract(IExprCtx exprCtx, Variable caretVar)
{
return getCalsBefore(caretVar)
.lmt(75)
.flt(call -> "extract".equals(call.getName()))
.fap(call -> {
IExprCtx extractCtx = exprCtx.subCtxDirect(call);
Mt source = extractCtx.func().getArgMt(0);
String prefix = extractCtx.func().getArgMt(2).getStringValues().fst().def("");
return source.types.map(t -> {
DeepType resultt = new DeepType(t.definition, PhpType.ARRAY);
t.keys.fch(k -> k.keyType.getNames()
.fch(n -> resultt.addKey(prefix + n, k.definition)
.addType(() -> new Mt(k.getTypes()), k.getBriefTypes().wap(Mt::joinIdeaTypes))));
return resultt;
});
});
}

/** @return type of an associative array with vars to suggest as keys */
private It<DeepType> resolve(VariableImpl caretVar, boolean isAutoPopup, Editor editor)
{
SearchContext search = new SearchContext(caretVar.getProject())
Expand All @@ -102,7 +125,8 @@ private It<DeepType> resolve(VariableImpl caretVar, boolean isAutoPopup, Editor
IExprCtx exprCtx = new ExprCtx(funcCtx, caretVar, 0);

return It.cnc(
resolveGlobalsMagicVar(exprCtx, caretVar)
resolveGlobalsMagicVar(exprCtx, caretVar),
resolveExtract(exprCtx, caretVar)
);
}

Expand Down
9 changes: 7 additions & 2 deletions src/org/klesun/deep_assoc_completion/helpers/Mt.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,13 +139,18 @@ public It<DeepType.Key> getProps()
return types.fap(t -> t.props.vls());
}

public static PhpType getIdeaTypeSt(It<DeepType> types)
public static PhpType joinIdeaTypes(Iterable<PhpType> ideaTypes)
{
PhpType ideaType = new PhpType();
types.map(t -> t.briefType).fch(ideaType::add);
It(ideaTypes).fch(ideaType::add);
return ideaType;
}

public static PhpType getIdeaTypeSt(It<DeepType> types)
{
return joinIdeaTypes(types.map(t -> t.briefType));
}

public PhpType getIdeaType()
{
return getIdeaTypeSt(It(types));
Expand Down
11 changes: 11 additions & 0 deletions tests/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -914,6 +914,17 @@ private function testMultilineDoc($params, $params2, $params3)
$params[''];
}

private function testExtract()
{
$pax = ['name' => 'Vova', 'age' => 15, 'gender' => 'M'];
extract($pax);
// should suggest: name, age, gender
$age;
extract($pax, null, 'somePrefix_');
// should suggest: somePrefix_name, somePrefix_age, somePrefix_gender
$somePrefix_gender;
}

//============================
// not implemented follow
//============================
Expand Down

0 comments on commit 2197a04

Please sign in to comment.