Skip to content

Commit

Permalink
Support document formatting (#10)
Browse files Browse the repository at this point in the history
  • Loading branch information
Michal Niewrzal authored and felixfbecker committed Sep 6, 2016
1 parent d1b9b33 commit 6169998
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 3 deletions.
20 changes: 20 additions & 0 deletions fixtures/format.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace TestNamespace;




class TestClass
{
public $testProperty;

public function testMethod($testParameter)
{
$testVariable = 123;

if ( empty($testParameter)){
echo 'Empty';
}
}
}
15 changes: 15 additions & 0 deletions fixtures/format_expected.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace TestNamespace;

class TestClass
{
public $testProperty;
public function testMethod($testParameter)
{
$testVariable = 123;
if (empty($testParameter)) {
echo 'Empty';
}
}
}
2 changes: 2 additions & 0 deletions src/LanguageServer.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ public function initialize(string $rootPath, int $processId, ClientCapabilities
$serverCapabilities->textDocumentSync = TextDocumentSyncKind::FULL;
// Support "Find all symbols"
$serverCapabilities->documentSymbolProvider = true;
// Support "Format Code"
$serverCapabilities->documentFormattingProvider = true;
return new InitializeResult($serverCapabilities);
}

Expand Down
26 changes: 25 additions & 1 deletion src/Server/TextDocument.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace LanguageServer\Server;

use PhpParser\{Error, Comment, Node, ParserFactory, NodeTraverser, Lexer};
use PhpParser\PrettyPrinter\Standard as PrettyPrinter;
use PhpParser\NodeVisitor\NameResolver;
use LanguageServer\{LanguageClient, ColumnCalculator, SymbolFinder};
use LanguageServer\Protocol\{
Expand All @@ -12,7 +13,9 @@
Diagnostic,
DiagnosticSeverity,
Range,
Position
Position,
FormattingOptions,
TextEdit
};

/**
Expand Down Expand Up @@ -124,4 +127,25 @@ private function updateAst(string $uri, string $content)
$this->asts[$uri] = $stmts;
}
}

/**
* The document formatting request is sent from the server to the client to format a whole document.
*
* @param TextDocumentIdentifier $textDocument The document to format
* @param FormattingOptions $options The format options
* @return TextEdit[]
*/
public function formatting(TextDocumentIdentifier $textDocument, FormattingOptions $options)
{
$nodes = $this->asts[$textDocument->uri];
if (empty($nodes)) {
return [];
}
$prettyPrinter = new PrettyPrinter();
$edit = new TextEdit();
$edit->range = new Range(new Position(0, 0), new Position(PHP_INT_MAX, PHP_INT_MAX));
$edit->newText = $prettyPrinter->prettyPrintFile($nodes);
return [$edit];
}

}
2 changes: 1 addition & 1 deletion tests/LanguageServerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public function testInitialize()
'workspaceSymbolProvider' => null,
'codeActionProvider' => null,
'codeLensProvider' => null,
'documentFormattingProvider' => null,
'documentFormattingProvider' => true,
'documentRangeFormattingProvider' => null,
'documentOnTypeFormattingProvider' => null,
'renameProvider' => null
Expand Down
32 changes: 31 additions & 1 deletion tests/Server/TextDocumentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use PHPUnit\Framework\TestCase;
use LanguageServer\Tests\MockProtocolStream;
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};

class TextDocumentTest extends TestCase
Expand Down Expand Up @@ -197,4 +197,34 @@ public function publishDiagnostics(string $uri, array $diagnostics)
]]
], 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));
}
}

0 comments on commit 6169998

Please sign in to comment.