Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Highlighter.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Tempest\Highlight\Languages\Dockerfile\DockerfileLanguage;
use Tempest\Highlight\Languages\DotEnv\DotEnvLanguage;
use Tempest\Highlight\Languages\Gdscript\GdscriptLanguage;
use Tempest\Highlight\Languages\Go\GoLanguage;
use Tempest\Highlight\Languages\Graphql\GraphqlLanguage;
use Tempest\Highlight\Languages\Html\HtmlLanguage;
use Tempest\Highlight\Languages\Http\HttpLanguage;
Expand Down Expand Up @@ -77,6 +78,7 @@ public function __construct(
->addLanguage(new DocCommentLanguage())
->addLanguage(new DockerfileLanguage())
->addLanguage(new GdscriptLanguage())
->addLanguage(new GoLanguage())
->addLanguage(new GraphqlLanguage())
->addLanguage(new HtmlLanguage())
->addLanguage(new HttpLanguage())
Expand Down
52 changes: 52 additions & 0 deletions src/Languages/Go/GoLanguage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go;

use Override;
use Tempest\Highlight\Languages\Base\BaseLanguage;
use Tempest\Highlight\Languages\Go\Patterns\GoCommentPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoFunctionPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoKeywordPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoLiteralPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoNumberPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoOperatorPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoStringPattern;
use Tempest\Highlight\Languages\Go\Patterns\GoTypePattern;

final class GoLanguage extends BaseLanguage
{
public function getName(): string
{
return 'go';
}

#[Override]
public function getAliases(): array
{
return ['golang'];
}

#[Override]
public function getInjections(): array
{
return [];
}

#[Override]
public function getPatterns(): array
{
return [
...parent::getPatterns(),
new GoCommentPattern(),
new GoStringPattern(),
new GoNumberPattern(),
new GoKeywordPattern(),
new GoTypePattern(),
new GoLiteralPattern(),
new GoFunctionPattern(),
new GoOperatorPattern(),
];
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoCommentPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: '// note', output: '// note')]
#[PatternTest(input: '/* note */', output: '/* note */')]
final readonly class GoCommentPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match>\/\/[^\r\n]*|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\/)/s';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::COMMENT;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoFunctionPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'render()', output: 'render')]
#[PatternTest(input: 'append(values)', output: 'append')]
final readonly class GoFunctionPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '\b(?<match>[A-Za-z_]\w*)(?=\s*(?:\[[^\[\]\r\n]*\]\s*)?\()';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::PROPERTY;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoKeywordPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'package main', output: 'package')]
#[PatternTest(input: 'func render()', output: 'func')]
final readonly class GoKeywordPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '\b(?<match>break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go|goto|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::KEYWORD;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoLiteralPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'true', output: 'true')]
#[PatternTest(input: 'nil', output: 'nil')]
final readonly class GoLiteralPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '\b(?<match>false|iota|nil|true)\b';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::LITERAL;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoNumberPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: '0xFF', output: '0xFF')]
#[PatternTest(input: '1_000', output: '1_000')]
final readonly class GoNumberPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<![\w.])(?<match>(?:0[xX][\dA-Fa-f](?:_?[\dA-Fa-f])*(?:\.[\dA-Fa-f](?:_?[\dA-Fa-f])*)?(?:[pP][+-]?\d(?:_?\d)*)?|0[bB][01](?:_?[01])*|0[oO][0-7](?:_?[0-7])*|\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?)(?:i)?)(?![\w.])/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::NUMBER;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoOperatorPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'value <- input', output: '<-')]
#[PatternTest(input: 'value := 1', output: ':=')]
final readonly class GoOperatorPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match><-|:=|\+\+|--|<<=?|>>=?|&\^=?|&&|\|\||==|!=|<=|>=|\.\.\.|[-+*\/%&|^!<>=]=?|[~.,:;{}()\[\]])/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::OPERATOR;
}
}
28 changes: 28 additions & 0 deletions src/Languages/Go/Patterns/GoStringPattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: '"hello"', output: '"hello"')]
#[PatternTest(input: '`raw text`', output: '`raw text`')]
#[PatternTest(input: '\'x\'', output: '\'x\'')]
final readonly class GoStringPattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '/(?<match>`[^`]*`|"(?:\\\\.|[^"\\\\\r\n])*"|\'(?:\\\\.|[^\'\\\\\r\n])+\')/';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::VALUE;
}
}
27 changes: 27 additions & 0 deletions src/Languages/Go/Patterns/GoTypePattern.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Go\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\TokenTypeEnum;

#[PatternTest(input: 'type Result struct{}', output: 'Result')]
#[PatternTest(input: 'string', output: 'string')]
final readonly class GoTypePattern implements Pattern
{
use IsPattern;

public function getPattern(): string
{
return '(?<match>(?<=\btype\s)[A-Za-z_]\w*|\b(?:any|bool|byte|comparable|complex64|complex128|error|float32|float64|int|int8|int16|int32|int64|rune|string|uint|uint8|uint16|uint32|uint64|uintptr)\b)';
}

public function getTokenType(): TokenTypeEnum
{
return TokenTypeEnum::TYPE;
}
}
26 changes: 26 additions & 0 deletions tests/Bench/Fixtures/go.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package main

import (
"context"
"fmt"
)

type Result[T any] struct {
Value T
Err error
}

func collect[T comparable](ctx context.Context, input <-chan T) []Result[T] {
results := make([]Result[T], 0, 16)
for value := range input {
select {
case <-ctx.Done():
return append(results, Result[T]{Err: ctx.Err()})
default:
results = append(results, Result[T]{Value: value})
}
}

fmt.Printf("collected %d values\n", len(results))
return results
}
1 change: 1 addition & 0 deletions tests/Bench/HighlighterBench.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ final class HighlighterBench
'dockerfile' => 'dockerfile.txt',
'dotenv' => 'dotenv.txt',
'gdscript' => 'gdscript.txt',
'go' => 'go.txt',
'graphql' => 'graphql.txt',
'html' => 'html.txt',
'http' => 'http.txt',
Expand Down
Loading
Loading