Skip to content

Commit 0c220ab

Browse files
authored
Merge pull request #203 from DorZuberi/add-terraform-language-support
2 parents 034f69a + fadac37 commit 0c220ab

14 files changed

Lines changed: 553 additions & 0 deletions

src/Highlighter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Tempest\Highlight\Languages\Scss\ScssLanguage;
2727
use Tempest\Highlight\Languages\Sql\SqlLanguage;
2828
use Tempest\Highlight\Languages\Terminal\TerminalLanguage;
29+
use Tempest\Highlight\Languages\Terraform\TerraformLanguage;
2930
use Tempest\Highlight\Languages\Text\TextLanguage;
3031
use Tempest\Highlight\Languages\Twig\TwigLanguage;
3132
use Tempest\Highlight\Languages\Xml\XmlLanguage;
@@ -73,6 +74,7 @@ public function __construct(private readonly Theme $theme = new CssTheme())
7374
->addLanguage(new ScssLanguage())
7475
->addLanguage(new SqlLanguage())
7576
->addLanguage(new TerminalLanguage())
77+
->addLanguage(new TerraformLanguage())
7678
->addLanguage(new XmlLanguage())
7779
->addLanguage(new YamlLanguage())
7880
->addLanguage(new DotEnvLanguage())
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'resource "aws_instance" "web" {', output: 'resource')]
13+
#[PatternTest(input: 'variable "instance_type" {', output: 'variable')]
14+
final readonly class TerraformBlockTypePattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
$blockTypes = implode('|', [
21+
'resource', 'data', 'variable', 'output', 'locals',
22+
'module', 'provider', 'terraform', 'moved', 'import', 'check',
23+
]);
24+
25+
return "/^(?<match>{$blockTypes})\b/m";
26+
}
27+
28+
public function getTokenType(): TokenTypeEnum
29+
{
30+
return TokenTypeEnum::KEYWORD;
31+
}
32+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'enabled = true', output: 'true')]
13+
#[PatternTest(input: 'value = null', output: 'null')]
14+
final readonly class TerraformBooleanPattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
return '\b(?<match>true|false|null)\b';
21+
}
22+
23+
public function getTokenType(): TokenTypeEnum
24+
{
25+
return TokenTypeEnum::VALUE;
26+
}
27+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(
13+
input: '<<EOT
14+
hello world
15+
EOT',
16+
output: '<<EOT
17+
hello world
18+
EOT',
19+
)]
20+
#[PatternTest(
21+
input: '<<-POLICY
22+
some content
23+
POLICY',
24+
output: '<<-POLICY
25+
some content
26+
POLICY',
27+
)]
28+
final readonly class TerraformHeredocPattern implements Pattern
29+
{
30+
use IsPattern;
31+
32+
public function getPattern(): string
33+
{
34+
return '/(?<match><<-?\s*([A-Z_][A-Z0-9_]*)\n.*?\n\s*\2)/s';
35+
}
36+
37+
public function getTokenType(): TokenTypeEnum
38+
{
39+
return TokenTypeEnum::VALUE;
40+
}
41+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: '"Hello ${var.name}"', output: '${var.name}')]
13+
final readonly class TerraformInterpolationPattern implements Pattern
14+
{
15+
use IsPattern;
16+
17+
public function getPattern(): string
18+
{
19+
return '(?<match>\$\{[^}]+\})';
20+
}
21+
22+
public function getTokenType(): TokenTypeEnum
23+
{
24+
return TokenTypeEnum::GENERIC;
25+
}
26+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'for_each = var.instances', output: 'for_each')]
13+
#[PatternTest(input: 'count = 3', output: 'count')]
14+
final readonly class TerraformKeywordPattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
$keywords = implode('|', [
21+
'for', 'in', 'if', 'else', 'for_each', 'count',
22+
'depends_on', 'lifecycle', 'dynamic', 'content', 'each', 'self',
23+
]);
24+
25+
return "\b(?<match>(?:{$keywords}))\b";
26+
}
27+
28+
public function getTokenType(): TokenTypeEnum
29+
{
30+
return TokenTypeEnum::KEYWORD;
31+
}
32+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'ami = "abc"', output: '=')]
13+
#[PatternTest(input: 'a == b', output: '==')]
14+
#[PatternTest(input: 'key => value', output: '=>')]
15+
final readonly class TerraformOperatorPattern implements Pattern
16+
{
17+
use IsPattern;
18+
19+
public function getPattern(): string
20+
{
21+
return '(?<match>=>|==|!=|>=|<=|&&|\|\||[=><!\?:])';
22+
}
23+
24+
public function getTokenType(): TokenTypeEnum
25+
{
26+
return TokenTypeEnum::OPERATOR;
27+
}
28+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: ' ami = "abc-123"', output: 'ami')]
13+
#[PatternTest(input: ' instance_type = "t2.micro"', output: 'instance_type')]
14+
final readonly class TerraformPropertyPattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
return '/^\s*(?<match>[a-zA-Z_][a-zA-Z0-9_]*)\s*=/m';
21+
}
22+
23+
public function getTokenType(): TokenTypeEnum
24+
{
25+
return TokenTypeEnum::PROPERTY;
26+
}
27+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'type = string', output: 'string')]
13+
#[PatternTest(input: 'type = list(string)', output: 'list')]
14+
final readonly class TerraformTypePattern implements Pattern
15+
{
16+
use IsPattern;
17+
18+
public function getPattern(): string
19+
{
20+
$types = implode('|', [
21+
'string', 'number', 'bool', 'list', 'map',
22+
'set', 'object', 'tuple', 'any', 'optional',
23+
]);
24+
25+
return "\b(?<match>(?:{$types}))\b";
26+
}
27+
28+
public function getTokenType(): TokenTypeEnum
29+
{
30+
return TokenTypeEnum::TYPE;
31+
}
32+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Highlight\Languages\Terraform\Patterns;
6+
7+
use Tempest\Highlight\IsPattern;
8+
use Tempest\Highlight\Pattern;
9+
use Tempest\Highlight\PatternTest;
10+
use Tempest\Highlight\Tokens\TokenTypeEnum;
11+
12+
#[PatternTest(input: 'ami = var.ami_id', output: 'var.ami_id')]
13+
#[PatternTest(input: 'name = local.name', output: 'local.name')]
14+
#[PatternTest(input: 'id = module.vpc.id', output: 'module.vpc.id')]
15+
final readonly class TerraformVariablePattern implements Pattern
16+
{
17+
use IsPattern;
18+
19+
public function getPattern(): string
20+
{
21+
$prefixes = 'var|local|module|data|each|self';
22+
23+
return "(?<match>(?:{$prefixes})(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)+)";
24+
}
25+
26+
public function getTokenType(): TokenTypeEnum
27+
{
28+
return TokenTypeEnum::VARIABLE;
29+
}
30+
}

0 commit comments

Comments
 (0)