Giter Site home page Giter Site logo

king2500 / idea-php-advanced-autocomplete Goto Github PK

View Code? Open in Web Editor NEW
61.0 61.0 7.0 588 KB

Plugin for PhpStorm IDE. Adds auto-completion support for various built-in PHP functions, where parameter is a string literal.

Home Page: https://plugins.jetbrains.com/phpstorm/plugin/7276-php-advanced-autocomplete

License: MIT License

Java 97.13% PHP 2.87%
autocomplete intellij intellij-plugin java phpstorm phpstorm-plugin

idea-php-advanced-autocomplete's People

Contributors

haehnchen avatar king2500 avatar maximethebault avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

idea-php-advanced-autocomplete's Issues

Completion for regex captures in preg_replace

preg_replace('/a(foo)bar/i', '$<caret>', $var);
preg_replace('/a(foo)bar/i', '\<caret>', $var);
preg_replace_callback('/a(foo)bar/i', function ($matches) {
    return $matches[<caret>];
}, $var);
preg_replace_callback('/a(?<named>foo)bar/i', function ($matches) {
    return $matches['<caret>'];
}, $var);
preg_replace_callback('/a(foo)bar/i', function ($matches) {
    return $<caret> // lists all possible $matches[x] as variable with type text 'string'
}, $var);

Completion popup should show the regex part from brackets ((foo) in above example) as tail text.
If the first function parameter is a variable (like $fooRegex), field ($this->fooRegex) or constant (FOO_REGEX), it should also take that declaration into account.

Reference:
https://www.php.net/manual/de/function.preg-replace.php

auto-completion for custom date functions?

Hi, I have something like the following code in a class and I wanted to ask if it's possible to have also auto-completion for this use-cases?

PS: thanks for this plugin ๐Ÿ‘ ๐Ÿฅ‡

<?php

/**
 * @param string $format
 *
 * @return false|string
 */
function date_format_2($format = 'Y-m-d') {
    return date($format, 1571962614);
}

echo date_format_2('Y-m-d');

Security Contact Requested

@n33dle and I found a security vulnerability within the idea-php-advanced-autocomplete project. We were hoping to get a core maintainer's contact details to responsibly disclose this vulnerability.

Wrong unsetting suggestion

...
foreach ($id as &$i) {
    $i = $this->read($table, $data_model, $i);
}
return $id;
...

There is no need to unset $i after cycle.

StringIndexOutOfBoundsException: String index out of range: -1

header('<cursor>');

... throws:

String index out of range: -1
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at net.king2500.plugins.PhpAdvancedAutoComplete.PhpFunctionCompletionContributor$1.addCompletions(PhpFunctionCompletionContributor.java:149)
    at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
    at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:154)
    at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:84)
    at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:135)
    at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:128)
    at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$1.addCompletions(LiveTemplateCompletionContributor.java:75)
    at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
    at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:154)
    at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:84)
    at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:115)
    at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:784)
    at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$1000(CompletionProgressIndicator.java:89)
    at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:766)
    at com.intellij.codeInsight.completion.AsyncCompletion$1$1$1.run(CompletionThreading.java:93)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:908)
    at com.intellij.codeInsight.completion.AsyncCompletion$1$1.run(CompletionThreading.java:88)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl$3.run(ProgressManagerImpl.java:194)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.a(ProgressManagerImpl.java:281)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:233)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:181)
    at com.intellij.codeInsight.completion.AsyncCompletion$1.run(CompletionThreading.java:84)
    at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:406)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    at org.jetbrains.ide.PooledThreadExecutor$1$1.run(PooledThreadExecutor.java:56)

PhpStorm EAP 8.0.3 Build 139.1069

Remove ini vars completion

Since PhpStorm 2019.1 ini vars are bundled with expectedArguments completion.

This results in duplicate entries:
image

We can remove them now in this plugin.

can't type $ caracter

whenever I try to write $(Shift+4) from my keyboard it doesn't doing anything and throwing this error in console

NoSuchMethodError: com.intellij.codeInsight.AutoPopupController.invokeAutoPopupRunnable(Ljava/lang/Runnable;I)V

Advanced completion in .htaccess files

AddType <mime-types> .<ext>
AddDefaultCharset <charsets>
ErrorDocument <error-codes> <file-ref>

<IfModule <mod_*.c>>
php_flag <php-ini-directives> <On|Off>
php_value <php-ini-directives>
</IfModule>

RewriteEngine <On|Off>
RewriteCond <var> <regex-injection>  # var = %{NAME}
RewriteRule regex <file-ref> [<flags>]

AddOutputFilterByType <DEFLATE...> <mime-types...>
mod_gzip_on <Yes...>
...
mod_gzip_item_include <file|handler|mime|rspheader> <regex-injection>
mod_gzip_item_exclude # dito

Header <set> <response-headers>
Options +<options>
Options -<options>

....

Non-idempotent computation exception

Hi, I don't know exactly what I might've been doing at the time to give you context. The project I was working on is a Laravel 8, PHP 7.4, application. Let me know if there are any more specifics you'd like to know.

java.lang.Throwable: Non-idempotent computation: it returns different results when invoked multiple times or on different threads:
  MethodImpl: get != MethodImpl: get
  which is 0th element of [MethodImpl: get, MethodImpl: get] and [MethodImpl: get, MethodImpl: get]

Recomputation gives com.intellij.util.CachedValueBase$Data@191d71fe which is equivalent to 'existing'
Recomputation log:
  Resolve member reference: session()->get('flash_notification', collect())
Class reference: session()
 Class type: {\mixed, \Illuminate\Session\Store, \Illuminate\Contracts\Foundation\Application, \Illuminate\Session\SessionManager}
	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:159)
	at com.intellij.util.IdempotenceChecker.reportFailure(IdempotenceChecker.java:88)
	at com.intellij.util.IdempotenceChecker.checkEquivalence(IdempotenceChecker.java:75)
	at com.intellij.util.CachedValueBase.getValueWithLock(CachedValueBase.java:245)
	at com.intellij.psi.impl.PsiCachedValueImpl.getValue(PsiCachedValueImpl.java:43)
	at com.intellij.util.CachedValuesManagerImpl.getCachedValue(CachedValuesManagerImpl.java:78)
	at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:150)
	at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:120)
	at com.jetbrains.php.lang.psi.elements.impl.MemberReferenceImpl.resolveInHierarchy(MemberReferenceImpl.java:199)
	at com.jetbrains.php.lang.psi.elements.impl.MemberReferenceImpl.resolveGlobal(MemberReferenceImpl.java:184)
	at com.jetbrains.php.lang.psi.elements.impl.MethodReferenceImpl.resolveGlobal(MethodReferenceImpl.java:93)
	at com.jetbrains.php.lang.psi.elements.impl.PhpReferenceImpl.lambda$static$0(PhpReferenceImpl.java:159)
	at com.intellij.psi.impl.source.resolve.ResolveCache$PolyVariantResolver.resolve(ResolveCache.java:64)
	at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$resolve$1(ResolveCache.java:149)
	at com.intellij.openapi.util.Computable.get(Computable.java:17)
	at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$loggingResolver$3(ResolveCache.java:221)
	at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:111)
	at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:42)
	at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
	at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:198)
	at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:149)
	at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:164)
	at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:157)
	at com.jetbrains.php.lang.psi.elements.impl.PhpReferenceImpl.multiResolve(PhpReferenceImpl.java:153)
	at com.jetbrains.php.lang.psi.elements.impl.PhpReferenceImpl.resolve(PhpReferenceImpl.java:139)
	at net.king2500.plugins.PhpAdvancedAutoComplete.utils.PhpHelper.getMethodName(PhpHelper.java:70)
	at net.king2500.plugins.PhpAdvancedAutoComplete.utils.PhpHelper.getCanonicalFuncName(PhpHelper.java:34)
	at net.king2500.plugins.PhpAdvancedAutoComplete.PhpFileReferenceContributor$1.getReferencesByElement(PhpFileReferenceContributor.java:43)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.getReferences(ReferenceProvidersRegistryImpl.java:204)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.mapNotEmptyReferencesFromProviders(ReferenceProvidersRegistryImpl.java:167)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.doGetReferencesFromProviders(ReferenceProvidersRegistryImpl.java:146)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.lambda$getReferencesFromProviders$0(ReferenceProvidersRegistry.java:39)
	at com.intellij.psi.util.CachedValuesManager$1.compute(CachedValuesManager.java:153)
	at com.intellij.psi.impl.PsiCachedValueImpl.doCompute(PsiCachedValueImpl.java:54)
	at com.intellij.util.CachedValueBase.lambda$getValueWithLock$1(CachedValueBase.java:235)
	at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:111)
	at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:42)
	at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
	at com.intellij.util.CachedValueBase.getValueWithLock(CachedValueBase.java:236)
	at com.intellij.psi.impl.PsiCachedValueImpl.getValue(PsiCachedValueImpl.java:43)
	at com.intellij.util.CachedValuesManagerImpl.getCachedValue(CachedValuesManagerImpl.java:78)
	at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:150)
	at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:120)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:38)
	at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:31)
	at com.jetbrains.php.lang.psi.elements.impl.StringLiteralExpressionImpl.getReferences(StringLiteralExpressionImpl.java:432)
	at com.intellij.codeInsight.highlighting.HyperlinkAnnotator.annotate(HyperlinkAnnotator.java:45)
	at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.runAnnotators(DefaultHighlightVisitor.java:136)
	at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.visit(DefaultHighlightVisitor.java:116)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.runVisitors(GeneralHighlightingPass.java:336)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.lambda$collectHighlights$5(GeneralHighlightingPass.java:269)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.analyzeByVisitors(GeneralHighlightingPass.java:295)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.lambda$analyzeByVisitors$6(GeneralHighlightingPass.java:298)
	at com.intellij.codeInsight.daemon.impl.analysis.XmlHighlightVisitor.analyze(XmlHighlightVisitor.java:601)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.analyzeByVisitors(GeneralHighlightingPass.java:298)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.lambda$analyzeByVisitors$6(GeneralHighlightingPass.java:298)
	at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.analyze(DefaultHighlightVisitor.java:96)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.analyzeByVisitors(GeneralHighlightingPass.java:298)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectHighlights(GeneralHighlightingPass.java:266)
	at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectInformationWithProgress(GeneralHighlightingPass.java:212)
	at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:84)
	at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:56)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$1(PassExecutorService.java:400)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1137)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$2(PassExecutorService.java:393)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:658)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:610)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:65)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:392)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$0(PassExecutorService.java:368)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:172)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:183)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:366)
	at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask$1.exec(JobLauncherImpl.java:188)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Add advanced completion for custom methods/functions via meta php

.phpstorm.meta.php:

<?php
namespace PHPSTORM_META {
    xAdvancedCompletion(\My\Stuff\Example::formatDate(), 1, 'date_format');
}

User code:

$x = new Example();
$x->formatDate($val, '<caret>');

Plugin's built-in .phpstorm.meta.php:

<?php
namespace PHPSTORM_META {
    function xAdvancedCompletion($functionReference, $argumentIndex, $completionList) {
        return "xAdvancedCompletion " . $functionReference . " at " . $argumentIndex . ": " . $completionList;
    }

    registerArgumentsSet('x_advanced_completion_lists', 'date_format', 'strftime_format' /*...*/);
    expectedArguments(\PHPSTORM_META\xAdvancedCompletion(), 2, argumentsSet('x_advanced_completion_lists');
}

Solves #19

Allow File Reference injection via meta php

.phpstorm.meta.php:

<?php
namespace PHPSTORM_META {
    xAdvancedInjectFileReference(\My\Stuff\Example::dump(), 1);  // relative to doc root or current file (see below)
    xAdvancedInjectFileReference(\My\Stuff\Example::dump(), 1, '/'); // relative to doc root
    xAdvancedInjectFileReference(\My\Stuff\Example::dump(), 1, '.'); // relative to current file
    xAdvancedInjectFileReference(\My\Stuff\Example::dump(), 1, '/dir'); // relative to /dir/
}

User code:

$x = new Example();
$x->dump('bla', '<ref>path/to/file.ext</ref>');

If inside class always go relative from doc root.
If not inside class always go relative from current file.

Plugin's built-in .phpstorm.meta.php:

<?php
namespace PHPSTORM_META {
    function xAdvancedInjectFileReference($functionReference, $argumentIndex, $relativeMode = null) {
        return "xAdvancedInjectFileReference " . $functionReference . " at " . $argumentIndex . ": " . $relativeMode;
    }

    registerArgumentsSet('x_advanced_fileref_relative_modes', '/', '.');
    expectedArguments(\PHPSTORM_META\xAdvancedInjectFileReference(), 2, argumentsSet('x_advanced_fileref_relative_modes');
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.