cmur2 / language-terraform

Terraform.io support for Atom
MIT License
49 stars 32 forks source link

Key word updates #26

Closed Ipswitch closed 7 years ago

Ipswitch commented 7 years ago

I've just downloaded Atom to work with some terraform files and notice some keyword lists are short in the project.

I grep'd the terrrafrom source code, but would leave to you to update the .cson files. There are four patterns and I included the results for two. These caused some issues as the gtksourceview used with xed and gedit highlight functions could not handle a 54k regular expression. I'll leave it up to you.

echo grep -rPo --include \*.go ./builtin -e "(?<=\")[a-zA-Z0-9,_]*(?=\":\W*(&schema\.Schema))" | cut -d':' -f2 | sort | uniq | sed 's/\n//g' | sed 's/ /|/g'

echo grep -rPo --include \*.go ./builtin -e "(?<=\")[a-zA-Z0-9,_]*(?=\":\W*{)" | cut -d':' -f2 | sort | uniq | sed 's/\n//g' | sed 's/ /|/g'

echo grep -rPo --include \*.go ./builtin -e "(?<=\")[a-zA-Z0-9,_]*(?=\":\W*(interpolationFunc))" | cut -d':' -f2| sort | uniq | sed 's/\n//g' | sed 's/ /|/g' gives: base64decode|base64encode|cidrhost|cidrnetmask|cidrsubnet|coalesce|compact|concat|element|file|format|formatlist|index|join|length|lookup|lower|replace|split|upper

echo grep -rPo --include \*.go ./builtin -e "(?<=\")[a-zA-Z0-9,_]*(?=\":\W*(dataSource|resource))" | cut -d':' -f2 | sort | uniq | sed 's/\n//g' | sed 's/ /|/g' gives: alicloud_disk|alicloud_disk_attachment|alicloud_eip|alicloud_eip_association|alicloud_images|alicloud_instance|alicloud_instance_types|alicloud_nat_gateway|alicloud_regions|alicloud_route_entry|alicloud_security_group|alicloud_security_group_rule|alicloud_slb|alicloud_slb_attachment|alicloud_subnet|alicloud_vpc|alicloud_vswitch|alicloud_zones|archive_file|arukas_container|atlas_artifact|aws_acm_certificate|aws_alb|aws_alb_listener|aws_alb_listener_rule|aws_alb_target_group|aws_alb_target_group_attachment|aws_ami|aws_ami_copy|aws_ami_from_instance|aws_ami_launch_permission|aws_api_gateway_account|aws_api_gateway_api_key|aws_api_gateway_authorizer|aws_api_gateway_base_path_mapping|aws_api_gateway_client_certificate|aws_api_gateway_deployment|aws_api_gateway_domain_name|aws_api_gateway_integration|aws_api_gateway_integration_response|aws_api_gateway_method|aws_api_gateway_method_response|aws_api_gateway_model|aws_api_gateway_resource|aws_api_gateway_rest_api|aws_appautoscaling_policy|aws_appautoscaling_target|aws_app_cookie_stickiness_policy|aws_autoscaling_attachment|aws_autoscaling_group|aws_autoscaling_groups|aws_autoscaling_lifecycle_hook|aws_autoscaling_notification|aws_autoscaling_policy|aws_autoscaling_schedule|aws_availability_zone|aws_availability_zones|aws_billing_service_account|aws_caller_identity|aws_canonical_user_id|aws_cloudformation_stack|aws_cloudfront_distribution|aws_cloudfront_origin_access_identity|aws_cloudtrail|aws_cloudwatch_event_rule|aws_cloudwatch_event_target|aws_cloudwatch_log_group|aws_cloudwatch_log_metric_filter|aws_cloudwatch_log_stream|aws_cloudwatch_log_subscription_filter|aws_cloudwatch_metric_alarm|aws_codebuild_project|aws_codecommit_repository|aws_codecommit_trigger|aws_codedeploy_app|aws_codedeploy_deployment_config|aws_codedeploy_deployment_group|aws_config_config_rule|aws_config_configuration_recorder|aws_config_configuration_recorder_status|aws_config_delivery_channel|aws_customer_gateway|aws_db_event_subscription|aws_db_instance|aws_db_option_group|aws_db_parameter_group|aws_db_security_group|aws_db_subnet_group|aws_default_network_acl|aws_default_route_table|aws_default_security_group|aws_directory_service_directory|aws_dms_certificate|aws_dms_endpoint|aws_dms_replication_instance|aws_dms_replication_subnet_group|aws_dms_replication_task|aws_dynamodb_table|aws_ebs_snapshot|aws_ebs_volume|aws_ecr_repository|aws_ecr_repository_policy|aws_ecs_cluster|aws_ecs_container_definition|aws_ecs_service|aws_ecs_task_definition|aws_efs_file_system|aws_efs_mount_target|aws_eip|aws_eip_association|aws_elasticache_cluster|aws_elasticache_parameter_group|aws_elasticache_replication_group|aws_elasticache_security_group|aws_elasticache_subnet_group|aws_elastic_beanstalk_application|aws_elastic_beanstalk_application_version|aws_elastic_beanstalk_configuration_template|aws_elastic_beanstalk_environment|aws_elasticsearch_domain|aws_elasticsearch_domain_policy|aws_elastictranscoder_pipeline|aws_elastictranscoder_preset|aws_elb|aws_elb_attachment|aws_elb_hosted_zone_id|aws_elb_service_account|aws_emr_cluster|aws_emr_instance_group|aws_flow_log|aws_glacier_vault|aws_iam_access_key|aws_iam_account_alias|aws_iam_account_password_policy|aws_iam_group|aws_iam_group_membership|aws_iam_group_policy|aws_iam_group_policy_attachment|aws_iam_instance_profile|aws_iam_policy|aws_iam_policy_attachment|aws_iam_policy_document|aws_iam_role|aws_iam_role_policy|aws_iam_role_policy_attachment|aws_iam_saml_provider|aws_iam_server_certificate|aws_iam_user|aws_iam_user_login_profile|aws_iam_user_policy|aws_iam_user_policy_attachment|aws_iam_user_ssh_key|aws_inspector_assessment_target|aws_inspector_assessment_template|aws_inspector_resource_group|aws_instance|aws_internet_gateway|aws_ip_ranges|aws_key_pair|aws_kinesis_firehose_delivery_stream|aws_kinesis_stream|aws_kms_alias|aws_kms_key|aws_kms_secret|aws_lambda_alias|aws_lambda_event_source_mapping|aws_lambda_function|aws_lambda_permission|aws_launch_configuration|aws_lb_cookie_stickiness_policy|aws_lb_ssl_negotiation_policy|aws_lightsail_domain|aws_lightsail_instance|aws_lightsail_key_pair|aws_load_balancer_backend_server_policy|aws_load_balancer_listener_policy|aws_load_balancer_policy|aws_main_route_table_association|aws_nat_gateway|aws_network_acl|aws_network_acl_rule|aws_network_interface|aws_opsworks_application|aws_opsworks_custom_layer|aws_opsworks_ganglia_layer|aws_opsworks_haproxy_layer|aws_opsworks_instance|aws_opsworks_java_app_layer|aws_opsworks_memcached_layer|aws_opsworks_mysql_layer|aws_opsworks_nodejs_app_layer|aws_opsworks_permission|aws_opsworks_php_app_layer|aws_opsworks_rails_app_layer|aws_opsworks_rds_db_instance|aws_opsworks_stack|aws_opsworks_static_web_layer|aws_opsworks_user_profile|aws_partition|aws_placement_group|aws_prefix_list|aws_proxy_protocol_policy|aws_rds_cluster|aws_rds_cluster_instance|aws_rds_cluster_parameter_group|aws_redshift_cluster|aws_redshift_parameter_group|aws_redshift_security_group|aws_redshift_service_account|aws_redshift_subnet_group|aws_region|aws_route|aws_route53_delegation_set|aws_route53_health_check|aws_route53_record|aws_route53_zone|aws_route53_zone_association|aws_route_table|aws_route_table_association|aws_s3_bucket|aws_s3_bucket_notification|aws_s3_bucket_object|aws_s3_bucket_policy|aws_security_group|aws_security_group_rule|aws_ses_active_receipt_rule_set|aws_ses_configuration_set|aws_ses_event_destination|aws_ses_receipt_filter|aws_ses_receipt_rule|aws_ses_receipt_rule_set|aws_sfn_activity|aws_sfn_state_machine|aws_simpledb_domain|aws_snapshot_create_volume_permission|aws_sns_topic|aws_sns_topic_policy|aws_sns_topic_subscription|aws_spot_datafeed_subscription|aws_spot_fleet_request|aws_spot_instance_request|aws_sqs_queue|aws_sqs_queue_policy|aws_ssm_activation|aws_ssm_association|aws_ssm_document|aws_subnet|aws_volume_attachment|aws_vpc|aws_vpc_dhcp_options|aws_vpc_dhcp_options_association|aws_vpc_endpoint|aws_vpc_endpoint_route_table_association|aws_vpc_endpoint_service|aws_vpc_peering_connection|aws_vpc_peering_connection_accepter|aws_vpn_connection|aws_vpn_connection_route|aws_vpn_gateway|aws_vpn_gateway_attachment|aws_waf_byte_match_set|aws_waf_ipset|aws_waf_rule|aws_waf_size_constraint_set|aws_waf_sql_injection_match_set|aws_waf_web_acl|aws_waf_xss_match_set|azure_affinity_group|azure_data_disk|azure_dns_server|azure_hosted_service|azure_instance|azure_local_network_connection|azurerm_availability_set|azurerm_cdn_endpoint|azurerm_cdn_profile|azurerm_client_config|azurerm_container_registry|azurerm_container_service|azurerm_dns_aaaa_record|azurerm_dns_a_record|azurerm_dns_cname_record|azurerm_dns_mx_record|azurerm_dns_ns_record|azurerm_dns_srv_record|azurerm_dns_txt_record|azurerm_dns_zone|azurerm_eventhub|azurerm_eventhub_authorization_rule|azurerm_eventhub_consumer_group|azurerm_eventhub_namespace|azurerm_key_vault|azurerm_lb|azurerm_lb_backend_address_pool|azurerm_lb_nat_pool|azurerm_lb_nat_rule|azurerm_lb_probe|azurerm_lb_rule|azurerm_local_network_gateway|azurerm_network_interface|azurerm_network_security_group|azurerm_network_security_rule|azurerm_public_ip|azurerm_redis_cache|azurerm_resource_group|azurerm_route|azurerm_route_table|azurerm_search_service|azurerm_servicebus_namespace|azurerm_servicebus_subscription|azurerm_servicebus_topic|azurerm_sql_database|azurerm_sql_firewall_rule|azurerm_sql_server|azurerm_storage_account|azurerm_storage_blob|azurerm_storage_container|azurerm_storage_queue|azurerm_storage_share|azurerm_storage_table|azurerm_subnet|azurerm_template_deployment|azurerm_traffic_manager_endpoint|azurerm_traffic_manager_profile|azurerm_virtual_machine|azurerm_virtual_machine_extension|azurerm_virtual_machine_scale_set|azurerm_virtual_network|azurerm_virtual_network_peering|azure_security_group|azure_security_group_rule|azure_sql_database_server|azure_sql_database_server_firewall_rule|azure_sql_database_service|azure_storage_blob|azure_storage_container|azure_storage_queue|azure_storage_service|azure_virtual_network|bitbucket_default_reviewers|bitbucket_hook|bitbucket_repository|chef_acl|chef_client|chef_cookbook|chef_data_bag|chef_data_bag_item|chef_environment|chef_node|chef_role|clc_group|clc_load_balancer|clc_load_balancer_pool|clc_public_ip|clc_server|cloudflare_record|cloudstack_affinity_group|cloudstack_disk|cloudstack_egress_firewall|cloudstack_firewall|cloudstack_instance|cloudstack_ipaddress|cloudstack_loadbalancer_rule|cloudstack_network|cloudstack_network_acl|cloudstack_network_acl_rule|cloudstack_nic|cloudstack_port_forward|cloudstack_private_gateway|cloudstack_secondary_ipaddress|cloudstack_security_group|cloudstack_security_group_rule|cloudstack_ssh_keypair|cloudstack_static_nat|cloudstack_static_route|cloudstack_template|cloudstack_vpc|cloudstack_vpn_connection|cloudstack_vpn_customer_gateway|cloudstack_vpn_gateway|cobbler_distro|cobbler_kickstart_file|cobbler_profile|cobbler_snippet|cobbler_system|consul_agent_self|consul_agent_service|consul_catalog_entry|consul_catalog_nodes|consul_catalog_service|consul_catalog_services|consul_key_prefix|consul_keys|consul_node|consul_prepared_query|consul_service|datadog_monitor|datadog_timeboard|digitalocean_domain|digitalocean_droplet|digitalocean_floating_ip|digitalocean_record|digitalocean_ssh_key|digitalocean_tag|digitalocean_volume|dme_record|dns_aaaa_record_set|dns_a_record_set|dns_cname_record|dnsimple_record|dns_ptr_record|docker_container|docker_image|docker_network|docker_registry_image|docker_volume|dyn_record|external|fastly_ip_ranges|fastly_service_v1|filter|github_issue_label|github_membership|github_repository|github_repository_collaborator|github_team|github_team_membership|github_team_repository|google_compute_address|google_compute_autoscaler|google_compute_backend_service|google_compute_disk|google_compute_firewall|google_compute_forwarding_rule|google_compute_global_address|google_compute_global_forwarding_rule|google_compute_health_check|google_compute_http_health_check|google_compute_https_health_check|google_compute_image|google_compute_instance|google_compute_instance_group|google_compute_instance_group_manager|google_compute_instance_template|google_compute_network|google_compute_project_metadata|google_compute_region_backend_service|google_compute_route|google_compute_ssl_certificate|google_compute_subnetwork|google_compute_target_http_proxy|google_compute_target_https_proxy|google_compute_target_pool|google_compute_url_map|google_compute_vpn_gateway|google_compute_vpn_tunnel|google_compute_zones|google_container_cluster|google_dns_managed_zone|google_dns_record_set|google_iam_policy|google_project|google_project_iam_policy|google_project_services|google_pubsub_subscription|google_pubsub_topic|google_service_account|google_sql_database|google_sql_database_instance|google_sql_user|google_storage_bucket|google_storage_bucket_acl|google_storage_bucket_object|google_storage_object_acl|heroku_addon|heroku_app|heroku_cert|heroku_domain|heroku_drain|icinga2_checkcommand|icinga2_host|icinga2_hostgroup|icinga2_service|ignition_config|ignition_disk|ignition_file|ignition_filesystem|ignition_group|ignition_networkd_unit|ignition_raid|ignition_systemd_unit|ignition_user|influxdb_continuous_query|influxdb_database|influxdb_user|librato_alert|librato_service|librato_space|librato_space_chart|location|logentries_log|logentries_logset|mailgun_domain|mysql_database|mysql_grant|mysql_user|newrelic_alert_channel|newrelic_alert_condition|newrelic_alert_policy|newrelic_alert_policy_channel|newrelic_application|nomad_job|not_principals|ns1_datasource|null_data_source|null_resource|openstack_blockstorage_volume_attach_v2|openstack_blockstorage_volume_v1|openstack_blockstorage_volume_v2|openstack_compute_floatingip_v2|openstack_compute_instance_v2|openstack_compute_keypair_v2|openstack_compute_secgroup_v2|openstack_compute_servergroup_v2|openstack_compute_volume_attach_v2|openstack_fw_firewall_v1|openstack_fw_policy_v1|openstack_fw_rule_v1|openstack_images_image_v2|openstack_lb_listener_v2|openstack_lb_loadbalancer_v2|openstack_lb_member_v1|openstack_lb_member_v2|openstack_lb_monitor_v1|openstack_lb_monitor_v2|openstack_lb_pool_v1|openstack_lb_pool_v2|openstack_lb_vip_v1|openstack_networking_floatingip_v2|openstack_networking_network_v2|openstack_networking_port_v2|openstack_networking_router_interface_v2|openstack_networking_router_route_v2|openstack_networking_router_v2|openstack_networking_secgroup_rule_v2|openstack_networking_secgroup_v2|openstack_networking_subnet_v2|openstack_objectstorage_container_v1|opsgenie_team|opsgenie_user|packet_device|packet_project|packet_ssh_key|packet_volume|pagerduty_addon|pagerduty_escalation_policy|pagerduty_schedule|pagerduty_service|pagerduty_service_integration|pagerduty_team|pagerduty_user|pagerduty_vendor|postgresql_database|postgresql_extension|postgresql_role|postgresql_schema|powerdns_record|principals|profitbricks_datacenter|profitbricks_firewall|profitbricks_image|profitbricks_ipblock|profitbricks_lan|profitbricks_loadbalancer|profitbricks_location|profitbricks_nic|profitbricks_server|profitbricks_volume|rabbitmq_binding|rabbitmq_exchange|rabbitmq_permissions|rabbitmq_policy|rabbitmq_queue|rabbitmq_user|rabbitmq_vhost|rancher_environment|rancher_registration_token|rancher_registry|rancher_registry_credential|rancher_stack|random_id|random_shuffle|rundeck_job|rundeck_private_key|rundeck_project|rundeck_public_key|scaleway_bootscript|scaleway_image|scaleway_ip|scaleway_security_group|scaleway_security_group_rule|scaleway_server|scaleway_volume|scaleway_volume_attachment|softlayer_ssh_key|softlayer_virtual_guest|statuscake_test|tags|template_cloudinit_config|template_file|terraform_remote_state|tls_cert_request|tls_locally_signed_cert|tls_private_key|tls_self_signed_cert|triton_fabric|triton_firewall_rule|triton_key|triton_machine|triton_vlan|ultradns_dirpool|ultradns_probe_http|ultradns_probe_ping|ultradns_record|ultradns_tcpool|vcd_dnat|vcd_firewall_rules|vcd_network|vcd_snat|vcd_vapp|vsphere_file|vsphere_folder|vsphere_virtual_disk|vsphere_virtual_machine

GiantToast commented 7 years ago

Some things are matched directly, like the list of built in function keywords above (base64encode, etc.). Some things are matched by the form they take.

Is there anything specific you are seeing thats not working?

Rather than trying to match all the keywords exactly, the grammars try to match on the format that Terraform file entries require. For example, instead of matching aws_waf_ipset it attempts to match the form of:

resource "aws_waf_ipset" "name" {
    ...
}

and so on.

If you give me some examples of what is not working as you expect, I'd be happy to take a look. Thanks for the feedback.

Ipswitch commented 7 years ago

I'm new to Atom and misdirected the issue. What I wish to accomplish is done with an autocomplete provider for the Terraform language. Highlighting is OK, hints are better.

autocompleteterraform 2017-02-22 17-01-15

GiantToast commented 7 years ago

Understood, I'll see if I can update the list.

Ipswitch commented 7 years ago

I'm playing with the following to update the language-terraform.cson file. You'll need to clean up captured examples, but it's a start.

for fn in grep -rPo --include \*.go ./builtin -e "((?<=\")[a-zA-Z0-9,_]*(?=\":\W*{))|((?<=\")[a-zA-Z0-9,_]*(?=\":\W*(&schema\.Schema)))|(?<=\")[a-zA-Z0-9,_]*(?=\":\W*(dataSource|resource))" | cut -d':' -f2 | sort | uniq; do echo -e "\t'$fn':\n\t\t'prefix': 'expr substr $fn 1 2'\n\t\t'body': \"$fn\""; done >> language-terraform/language-terraform/settings/language-terraform.cson

Ipswitch commented 7 years ago

A contextual autocomplete is going to take more time than I have. This met the need and didn't break the snippets

git clone git@github.com:hashicorp/terraform.git; echo "'.source.terraform':" > ~/.atom/packages/language-terraform/snippets/keywords.cson; for fn in grep -rPo --include \*.go ./terraform/builtin -e "((?<=\")[a-zA-Z0-9,_]*(?=\":\W*{))|((?<=\")[a-zA-Z0-9,_]*(?=\":\W*(&schema\.Schema)))|(?<=\")[a-zA-Z0-9,_]*(?=\":\W*(dataSource|resource))" | cut -d':' -f2 | sort | uniq; do if ! grep -Fxq " '$fn':" ~/.atom/packages/language-terraform/snippets/snippets.cson; then echo -e " '$fn':\n 'prefix': '$fn'\n 'body': \"$fn\"\n"; fi; done >> ~/.atom/packages/language-terraform/snippets/keywords.cson; rm -rf terraform

GiantToast commented 7 years ago

Thanks for the great suggestion and feedback. I'm slowly working on adding in autocomplete stuff to handle that as my time allows. I'm pretty swamped at work right now, but we'll get it in eventually. Just wanted to say I haven't forgotten about this.

GiantToast commented 7 years ago

After merging in your pull request, is okay if I close this?