Commit Graph

125 Commits

Author SHA1 Message Date
James Nugent
e3d360614a Revert "Skip a nil item during filtering" 2016-09-02 09:48:18 -07:00
James Nugent
9edfb078e1 Merge pull request #121 from hashicorp/filter-skip-nil-item
Skip nil items during filtering
2016-09-02 11:32:56 -05:00
Mitchell Hashimoto
9250907631
hcl/scanner: single line '//' commments verify second '/'
The way the scanner works '/ foo' was actually valid comment syntax.
This obviously is not what we want. This modifies the scanner to verify
that '//' comments in fact have the second '/'.
2016-09-01 19:50:55 -07:00
Mitchell Hashimoto
baeb59c710
hcl/parser: test case for error in "10kb"
https://github.com/hashicorp/terraform/issues/3287#issuecomment-195779840
2016-08-22 14:41:45 -07:00
James Nugent
a55c206bd0 Support multiline string literals in HCL
This allows multiline strings to be parsed in order to make HIL
interpolations nicer in Terraform:

```
my_complex_thing = "${merge(var.list1,
                            var.list2,
                            var.list3)}"
```
2016-07-11 14:33:17 -06:00
Paul Hinze
364df43084 Merge pull request #137 from hashicorp/f-list-of-maps
hcl/parser: Support lists of objects
2016-07-08 09:13:38 -05:00
James Nugent
5c900ca702 Add test for list of objects in printer 2016-07-08 13:25:14 +01:00
James Nugent
d7ee01d2a7 Merge pull request #135 from hashicorp/b-null
hcl/scanner: handle \"\\0 input properly
2016-07-08 11:51:59 +01:00
Paul Hinze
92237bfa68
hcl/parser: Support lists of objects
a.k.a lists of maps

Implementation was pretty straightforward - I had to tweak the `needsComma`
handling since it was stuck inside literal parsing. It happens out front
now. I also promoted the `assign_deep.hcl` parser test to a decoder
test that passes, since it was testing for an error to occur but now it
works! :)

Additionally we make ObjectLists support being comma-delimited, which
enables maps to defined inline like `{one = 1, two = 2}`.

Refs https://github.com/hashicorp/terraform/issues/7142
2016-07-06 13:01:52 -05:00
James Nugent
61f5143284 Merge pull request #134 from hashicorp/b-fuzz
Fix parser bugs found via fuzzing from GH-128
2016-06-24 15:12:30 +03:00
Mitchell Hashimoto
5b7dbf7eef Merge pull request #117 from dcarley/fmt_docs_write
hcl/fmtcmd: Clarify docs for Options.Diff
2016-06-21 13:42:41 -07:00
Mitchell Hashimoto
66b2aabe46
hcl/scanner: more comments 2016-06-21 13:39:12 -07:00
Mitchell Hashimoto
a6c7514d8d
hcl/scanner: handle \"\\0 input properly 2016-06-21 13:38:25 -07:00
Mitchell Hashimoto
c9b6178f09
hcl/parser: remove spew 2016-06-21 13:26:05 -07:00
Mitchell Hashimoto
50042432b0
hcl/parser: fix broken parsing of: "v=/\n[," 2016-06-21 13:21:48 -07:00
Mitchell Hashimoto
6816a5c3fb
fix panic on decode of "t=0t d{}" 2016-06-21 13:18:51 -07:00
Mitchell Hashimoto
352bb4b5e3
hcl/parser: don't allow objects with no keys 2016-06-21 13:07:06 -07:00
James Nugent
39143f46f8 Fix bug with unquoting null from JSON-encoded HCL
Fixes hashicorp/terraform#6774.
2016-06-20 20:02:34 +03:00
Paul Hinze
2fb7c957a4
Remove BC escaped double quote behavior
When we switched to the current edition of the HCL parser, we
inadvertently broke some undocumented behavior where users could
successfully used escaped double quotes in a nested interpolation like
this:

    foo = "${somefunc(\"somearg\")}"

The proper syntax here is:

    foo = "${somefunc("somearg")}"

Because once you are inside the interpolation braces, the "quoting
context" is different.

At the time, while we didn't like the fact that the non-standard syntax
was in the wild, we didn't want to break BC, so we treated it as a bug
and fixed it in #62.

Now that we are at the moment of a major Terraform release, we can yank
the BC compatible behavior, which fixes a currently broken use case -
there is no way to express strings with double quotes in them from
inside interpolation braces.

    foo = "${somefunc("\"inquotes\"")}"

After merge and a dep upgrade, this will take care of
https://github.com/hashicorp/terraform/issues/5550
2016-06-16 12:43:37 -05:00
Paul Hinze
8e05f061d6
strconv: Fix escaped backslashes \\ in braces ${}
Fixes https://github.com/hashicorp/terraform/issues/6359 and several
related issues by unescaping a double backslash within braces to a
single backslash.

This bumps into the bit of HIL that still hangs out in HCL - for values
that aren't interpolated, like Terraform's variable defaults - users
were unable to get a backslash to show up within `${}`.

That's because `${}` is handled specially to allow for, e.g., double
quotes inside of braces.

Here, we add `\\` as a special cased escape (along with `\"`) so users
can get backslashes in these scenarios by doubling them up.
2016-06-06 19:05:05 -05:00
vishalnayak
b5065874bc Skip a nil item during filtering 2016-05-10 20:33:58 -04:00
Dan Carley
1793ae0f56 hcl/fmtcmd: Clarify docs for Options.Diff
This description was originally copied straight from gofmt[0]. But as noted
in hashicorp/terraform#6343, the "instead of rewriting" suggests that it
disables the `Write` option, whereas it is possible to enable both.

[0]: https://golang.org/src/cmd/gofmt/gofmt.go#L31
2016-04-28 18:03:01 +01:00
Paul Hinze
2f980537dd
fmtcmd: Remove extra newline
The fmtcmd tests weren't running before due to the same build tag
problem as #112, so didn't catch the fact that there was an extra
newline being added here, which is now doubled thanks to #112.

Fixing up the build tag reveals failing tests - removing the extra
newline fixes the tests.
2016-04-26 16:06:22 -05:00
Paul Hinze
2eb00dcf94 printer: output EOF newline in formatted hcl
Noticed that the `hclfmt` tool (which uses hcl/printer) was chomping
the trailing newline from config files.

Here we switch to the more conventional newline-at-EOF output.

In the process of changing this, I realized that:

 * The printer_test.go build tag was wrong, so it wasn't running
 * The format() test helper was not exercising Format

So both of those fixes are included here
2016-04-06 09:09:04 -05:00
James Nugent
f5480db646 Remove hanging indent on HEREDOCs with <<- prefix
This commit adds support for removing a hanging indent from HEREDOC
token contents if the marker is prefixed with <<-. For example, given
the HCL definition:

my_long_var_name = <<-EOF
                   {
                       "key": "value"
                   }
                   EOF

The value of the HEREDOC will be:

{
    "key": "value"
}

This is useful for use cases where indentation or leading whitespace
is important.

The rule applied is that the prefix on the terminating marker will be
removed from each each line in the HEREDOC, providing all the lines have
that prefix (i.e. every line is at least as indented as the terminating
marker, and using the same mechanism of tabs vs spaces).
2016-03-21 14:12:20 +00:00
James Nugent
3ad5dd62fd Add support for indented HEREDOC terminators
This PR adds support for the style of HEREDOC often used in Ruby which
allows the terminating marker to be indented if the HEREDOC is started
with the sequence "<<-" rather than the usual "<<". This allows users to
express documents with more natural indentation:

resource "template_file" "test" {
    template = <<-HEREDOC
        First Line
        Second Line
    HEREDOC
}

Note that this does not attempt to add any semantics around removing
hanging indent from the actual text of the document, so extra
indentation would still be present. We could make use of the canonical
style for HCL herre to remove the hanging indent in the style of Ruby
which would probably be more predictable for users.
2016-03-21 14:12:20 +00:00
James Nugent
597882917a Temporarily gnore printer and fmt tests on Windows
The red CI build on Windows is making it harder to process actual bugs -
neither printer or fmt are used in any HC projects currently so
ignoring the tests on AppVeyor/Windows seems reasonable for now. At some
point they need fixing to account for line endings.
2016-03-21 13:56:16 +00:00
James Nugent
9832b69cfd Fix line endings in hclfmt test 2016-03-21 00:17:10 +00:00
Mitchell Hashimoto
99c4d58691 hcl/parser: better comments 2016-03-14 20:56:27 +01:00
Mitchell Hashimoto
faa2fba9b8 hcl/parser: error on bare object keys in object 2016-03-14 20:54:33 +01:00
Mitchell Hashimoto
7df3f8587e hcl/parser: test for bare key at top level 2016-03-14 20:44:57 +01:00
Miquel Sabaté Solà
0c3742819f printer: don't write a newline on empty objects
This is to match the same criteria as in gofmt.

Fixes #94

Signed-off-by: Miquel Sabaté Solà <msabate@suse.com>
2016-03-14 15:38:41 +01:00
Mitchell Hashimoto
71c7409f1a hcl/parser: add test case from TF issue 2016-03-01 10:33:45 -08:00
Mitchell Hashimoto
1c284ec98f Parser enforces closing RBRACE [GH-88] 2016-02-10 10:31:11 -08:00
Mitchell Hashimoto
8cc8107682 hcl/parser: more negative number tests 2016-02-07 12:08:28 -08:00
Mitchell Hashimoto
4cae6d33fa hcl/scanner: add test for negative number 2016-02-07 12:07:40 -08:00
Mitchell Hashimoto
a01f759c89 Merge pull request #85 from VladRassokhin/fix-list-comments-indent
Fix indent of list item comments
2016-02-07 10:45:49 -08:00
Mitchell Hashimoto
aa4dbbc2b7 hcl/printer: style change 2016-02-07 10:40:21 -08:00
Vladislav Rassokhin
d8e433406e Fix indent of list item comments 2016-02-07 18:20:06 +03:00
Vladislav Rassokhin
63e2043a82 Printer should not produce tailing spaces in lists 2016-02-07 17:29:06 +03:00
Mitchell Hashimoto
e96d23138c Merge pull request #80 from dcarley/fmtcmd
Add new fmtcmd package (linting)
2016-01-30 16:51:29 +01:00
Mitchell Hashimoto
578dd97468 hcl/ast: just adding a GoSTringer impl 2016-01-19 12:27:37 -08:00
Dan Carley
aee8c49b75 Add new fmtcmd package
This uses the `printer` package to normalise HCL files. It's inspired by
github.com/fatih/hclfmt - but it differs in that it's intended to be more
generic, re-usable, and follow the semantics of `gofmt` or `go fmt`.

I intend to utilise this in Terraform by implementing `terraform fmt`
sub-command which will normalise all files in the current working directory
(like `go fmt ./..`) or contents over STDIN (with `terraform fmt -` that
could be used by editor plugins). So that Terraform users can benefit from
linting without installing another package/binary.

I hope that by placing most of the logic in the HCL package it should be
easy to implement sub-commands in other projects that also use HCL.

Some notes about the implementation:

- the significant difference from `gofmt` is that STDIN/STDOUT are passed in
  and errors aren't logged/written directly to STDERR, which gives consumers
  (e.g. Terraform) the ability to set appropriate exit codes
- I chose to use inline fixtures instead of files because there were a
  number of times where I needed to reference the contents and group them
  together with diff output
- it seemed simplest to construct the expected outputs by looping over the
  relevant fixtures and building up a string/byte slice, hope it isn't too
  confusing to read
- the test failure reporting is kind of rough because the outputs are so
  large, but I didn't want to add another diff function
- I chose to have a separate test for sub-directories rather than making it
  the default in the fixtures so that I didn't need to add additional logic
  to the fixture rendering
- the fixtures are sorted by filename before any of the tests runs so that
  they match the order that they are read from disk by `filepath.Walk()`
2016-01-06 21:53:58 +00:00
Paul Hinze
3a2d43b647 Fix crash on missing braces
Fixes crash reported here https://github.com/hashicorp/terraform/issues/4350
2015-12-16 18:21:22 -06:00
James Nugent
665d74b45d Fix scanner for Windows line endings and add tests 2015-12-01 12:53:50 -05:00
Paul Hinze
e2c26b8e6f support heredoc identifiers with numbers
fixes https://github.com/hashicorp/terraform/issues/4079
2015-12-01 10:22:31 -06:00
James Nugent
8a65681ce2 Merge pull request #66 from hashicorp/b-heredoc-lists
Support HEREDOCs in lists
2015-11-29 11:28:44 +00:00
Eljas Alakulppi
2ec27b6be2 Fixed hang when comment was on the last line of the file 2015-11-29 00:20:41 +02:00
James Nugent
eb77c8f861 Support HEREDOCs in lists
This fixes a regression in Terraform where HEREDOCS were previously
supported in lists, reported in hashicorp/terraform#4065.
2015-11-26 14:52:16 +02:00
James Nugent
c190e41403 Fix scanning of identifiers of the form 'map.key'
This is used in `.tfvars` files for Terraform in order to allow
overriding values in maps, for example:

    map.key1 = "Value"
    map.key2 = "OtherValue"
2015-11-24 15:13:07 +02:00