1
0
Fork 0

Support document formatting #8

pull/10/head
Michal Niewrzal 2016-09-05 20:25:35 +02:00
parent 1bb2b4a86c
commit a2af52075b
5 changed files with 71 additions and 5 deletions

20
fixtures/Format.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace TestNamespace;
class TestClass
{
public $testProperty;
public function testMethod($testParameter)
{
$testVariable = 123;
if ( empty($testParameter)){
echo 'Empty';
}
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace TestNamespace;
class TestClass
{
public $testProperty;
public function testMethod($testParameter)
{
$testVariable = 123;
if (empty($testParameter)) {
echo 'Empty';
}
}
}

View File

@ -2,7 +2,8 @@
namespace LanguageServer\Server; namespace LanguageServer\Server;
use PhpParser\{Error, Comment, Node, ParserFactory, NodeTraverser, Lexer, PrettyPrinter\Standard as PrettyPrinterStandard}; use PhpParser\{Error, Comment, Node, ParserFactory, NodeTraverser, Lexer};
use PhpParser\PrettyPrinter\Standard as PrettyPrinter;
use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\NameResolver;
use LanguageServer\{LanguageClient, ColumnCalculator, SymbolFinder}; use LanguageServer\{LanguageClient, ColumnCalculator, SymbolFinder};
use LanguageServer\Protocol\{ use LanguageServer\Protocol\{
@ -137,10 +138,10 @@ class TextDocument
public function formatting(TextDocumentIdentifier $textDocument, FormattingOptions $options) public function formatting(TextDocumentIdentifier $textDocument, FormattingOptions $options)
{ {
$nodes = $this->asts[$textDocument->uri]; $nodes = $this->asts[$textDocument->uri];
if (empty($nodes)){ if (empty($nodes)) {
return []; return [];
} }
$prettyPrinter = new PrettyPrinterStandard(); $prettyPrinter = new PrettyPrinter();
$edit = new TextEdit(); $edit = new TextEdit();
$edit->range = new Range(new Position(0, 0), new Position(PHP_INT_MAX, PHP_INT_MAX)); $edit->range = new Range(new Position(0, 0), new Position(PHP_INT_MAX, PHP_INT_MAX));
$edit->newText = $prettyPrinter->prettyPrintFile($nodes); $edit->newText = $prettyPrinter->prettyPrintFile($nodes);

View File

@ -40,7 +40,7 @@ class LanguageServerTest extends TestCase
'workspaceSymbolProvider' => null, 'workspaceSymbolProvider' => null,
'codeActionProvider' => null, 'codeActionProvider' => null,
'codeLensProvider' => null, 'codeLensProvider' => null,
'documentFormattingProvider' => null, 'documentFormattingProvider' => true,
'documentRangeFormattingProvider' => null, 'documentRangeFormattingProvider' => null,
'documentOnTypeFormattingProvider' => null, 'documentOnTypeFormattingProvider' => null,
'renameProvider' => null 'renameProvider' => null

View File

@ -6,7 +6,7 @@ namespace LanguageServer\Tests\Server;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream; use LanguageServer\Tests\MockProtocolStream;
use LanguageServer\{Server, Client, LanguageClient}; use LanguageServer\{Server, Client, LanguageClient};
use LanguageServer\Protocol\{TextDocumentItem, TextDocumentIdentifier, SymbolKind, DiagnosticSeverity}; use LanguageServer\Protocol\{TextDocumentItem, TextDocumentIdentifier, SymbolKind, DiagnosticSeverity, FormattingOptions};
use AdvancedJsonRpc\{Request as RequestBody, Response as ResponseBody}; use AdvancedJsonRpc\{Request as RequestBody, Response as ResponseBody};
class TextDocumentTest extends TestCase class TextDocumentTest extends TestCase
@ -197,4 +197,34 @@ class TextDocumentTest extends TestCase
]] ]]
], json_decode(json_encode($args), true)); ], json_decode(json_encode($args), true));
} }
public function testFormatting()
{
$textDocument = new Server\TextDocument(new LanguageClient(new MockProtocolStream()));
// Trigger parsing of source
$textDocumentItem = new TextDocumentItem();
$textDocumentItem->uri = 'whatever';
$textDocumentItem->languageId = 'php';
$textDocumentItem->version = 1;
$textDocumentItem->text = file_get_contents(__DIR__ . '/../../fixtures/Format.php');
$textDocument->didOpen($textDocumentItem);
// how code should look after formatting
$expected = file_get_contents(__DIR__ . '/../../fixtures/Format_expected.php');
// Request formatting
$result = $textDocument->formatting(new TextDocumentIdentifier('whatever'), new FormattingOptions());
$this->assertEquals([0 => [
'range' => [
'start' => [
'line' => 0,
'character' => 0
],
'end' => [
'line' => PHP_INT_MAX,
'character' => PHP_INT_MAX
]
],
'newText' => $expected
]], json_decode(json_encode($result), true));
}
} }