mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			81 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 44ed47cea1 | ||
|  | de51cb08d2 | ||
|  | 3dd2d08190 | ||
|  | 3b625e1954 | ||
|  | 5c6f690b97 | ||
|  | 3bbfc907f3 | ||
|  | 053b8bca97 | ||
|  | 7fb3db6203 | ||
|  | ba09394f85 | ||
|  | c59c88f16e | ||
|  | 8a6e74799a | ||
|  | 4268769d2e | ||
|  | 6601864084 | ||
|  | d57aa37fb7 | ||
|  | e72347fd98 | ||
|  | 1b429ea46b | ||
|  | 9468ad4947 | ||
|  | 733ef63193 | ||
|  | 9ca6a5841e | ||
|  | 41ace5fba0 | ||
|  | cc4295b3b3 | ||
|  | 1e4ce80fd9 | ||
|  | 74a71fd90d | ||
|  | 9b08318456 | ||
|  | fa5b6b03dc | ||
|  | cb59296fe0 | ||
|  | f1be771611 | ||
|  | b66fcb2529 | ||
|  | f7fe1fee66 | ||
|  | 94367cc460 | ||
|  | 72bec1fddc | ||
|  | 4e2eba4ef8 | ||
|  | 10457b6639 | ||
|  | d58cbc68a6 | ||
|  | 01de40faaa | ||
|  | 62d285fce6 | ||
|  | 0056095e8c | ||
|  | d6dc3a3991 | ||
|  | b524461b7c | ||
|  | 76d41697aa | ||
|  | 32147b629e | ||
|  | e7b5e25bf8 | ||
|  | d761658f8b | ||
|  | 3719214aba | ||
|  | 47b109be36 | ||
|  | 1ec4db97c2 | ||
|  | 9fe5fe0de2 | ||
|  | b36ea7ac9d | ||
|  | 625b06c30d | ||
|  | 28bce533b2 | ||
|  | 93ec1922cb | ||
|  | 5d09fb67dd | ||
|  | 93dcb61742 | ||
|  | 3a03594685 | ||
|  | 5ce2c254f9 | ||
|  | d7814c4899 | ||
|  | 50c08bf29e | ||
|  | 34928baee6 | ||
|  | 27bb41aa4d | ||
|  | 1415f4b52d | ||
|  | ae8ffcad22 | ||
|  | f43633bf10 | ||
|  | a604de9846 | ||
|  | 3e224e0039 | ||
|  | 15b04f86c3 | ||
|  | 42af436c20 | ||
|  | 2b08c66f0b | ||
|  | f98ab593fb | ||
|  | f951ec07de | ||
|  | e9ac71590f | ||
|  | 210cd19876 | ||
|  | f473c555ac | ||
|  | 48e4394d87 | ||
|  | e1ce88920d | ||
|  | 675cee1d72 | ||
|  | 1c4baf6dc2 | ||
|  | 8f2820e9cc | ||
|  | 04c268e535 | ||
|  | ec749b3f8d | ||
|  | 08b63e7033 | ||
|  | 7867b946b9 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| *.gem | ||||
| /Gemfile.lock | ||||
| .bundle/ | ||||
| .idea | ||||
|   | ||||
							
								
								
									
										62
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -67,9 +67,6 @@ | ||||
| [submodule "vendor/grammars/language-javascript"] | ||||
| 	path = vendor/grammars/language-javascript | ||||
| 	url = https://github.com/atom/language-javascript | ||||
| [submodule "vendor/grammars/language-python"] | ||||
| 	path = vendor/grammars/language-python | ||||
| 	url = https://github.com/atom/language-python | ||||
| [submodule "vendor/grammars/language-shellscript"] | ||||
| 	path = vendor/grammars/language-shellscript | ||||
| 	url = https://github.com/atom/language-shellscript | ||||
| @@ -130,9 +127,6 @@ | ||||
| [submodule "vendor/grammars/Sublime-Text-2-OpenEdge-ABL"] | ||||
| 	path = vendor/grammars/Sublime-Text-2-OpenEdge-ABL | ||||
| 	url = https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL | ||||
| [submodule "vendor/grammars/sublime-rust"] | ||||
| 	path = vendor/grammars/sublime-rust | ||||
| 	url = https://github.com/jhasse/sublime-rust | ||||
| [submodule "vendor/grammars/sublime-befunge"] | ||||
| 	path = vendor/grammars/sublime-befunge | ||||
| 	url = https://github.com/johanasplund/sublime-befunge | ||||
| @@ -180,7 +174,7 @@ | ||||
| 	url = https://github.com/mokus0/Agda.tmbundle | ||||
| [submodule "vendor/grammars/Julia.tmbundle"] | ||||
| 	path = vendor/grammars/Julia.tmbundle | ||||
| 	url = https://github.com/nanoant/Julia.tmbundle | ||||
| 	url = https://github.com/JuliaEditorSupport/Julia.tmbundle | ||||
| [submodule "vendor/grammars/ooc.tmbundle"] | ||||
| 	path = vendor/grammars/ooc.tmbundle | ||||
| 	url = https://github.com/nilium/ooc.tmbundle | ||||
| @@ -247,9 +241,6 @@ | ||||
| [submodule "vendor/grammars/cpp-qt.tmbundle"] | ||||
| 	path = vendor/grammars/cpp-qt.tmbundle | ||||
| 	url = https://github.com/textmate/cpp-qt.tmbundle | ||||
| [submodule "vendor/grammars/css.tmbundle"] | ||||
| 	path = vendor/grammars/css.tmbundle | ||||
| 	url = https://github.com/textmate/css.tmbundle | ||||
| [submodule "vendor/grammars/d.tmbundle"] | ||||
| 	path = vendor/grammars/d.tmbundle | ||||
| 	url = https://github.com/textmate/d.tmbundle | ||||
| @@ -339,7 +330,7 @@ | ||||
| 	url = https://github.com/textmate/php-smarty.tmbundle | ||||
| [submodule "vendor/grammars/php.tmbundle"] | ||||
| 	path = vendor/grammars/php.tmbundle | ||||
| 	url = https://github.com/textmate/php.tmbundle | ||||
| 	url = https://github.com/brandonblack/php.tmbundle | ||||
| [submodule "vendor/grammars/postscript.tmbundle"] | ||||
| 	path = vendor/grammars/postscript.tmbundle | ||||
| 	url = https://github.com/textmate/postscript.tmbundle | ||||
| @@ -443,9 +434,6 @@ | ||||
| [submodule "vendor/grammars/Sublime-Nit"] | ||||
| 	path = vendor/grammars/Sublime-Nit | ||||
| 	url = https://github.com/R4PaSs/Sublime-Nit | ||||
| [submodule "vendor/grammars/language-hy"] | ||||
| 	path = vendor/grammars/language-hy | ||||
| 	url = https://github.com/rwtolbert/language-hy | ||||
| [submodule "vendor/grammars/Racket"] | ||||
| 	path = vendor/grammars/Racket | ||||
| 	url = https://github.com/soegaard/racket-highlight-for-github | ||||
| @@ -623,9 +611,6 @@ | ||||
| [submodule "vendor/grammars/language-yang"] | ||||
| 	path = vendor/grammars/language-yang | ||||
| 	url = https://github.com/DzonyKalafut/language-yang.git | ||||
| [submodule "vendor/grammars/perl6fe"] | ||||
| 	path = vendor/grammars/perl6fe | ||||
| 	url = https://github.com/MadcapJake/language-perl6fe.git | ||||
| [submodule "vendor/grammars/language-less"] | ||||
| 	path = vendor/grammars/language-less | ||||
| 	url = https://github.com/atom/language-less.git | ||||
| @@ -809,4 +794,45 @@ | ||||
| [submodule "vendor/grammars/rascal-syntax-highlighting"] | ||||
| 	path = vendor/grammars/rascal-syntax-highlighting | ||||
| 	url = https://github.com/usethesource/rascal-syntax-highlighting | ||||
|  | ||||
| [submodule "vendor/grammars/atom-language-perl6"] | ||||
| 	path = vendor/grammars/atom-language-perl6 | ||||
| 	url = https://github.com/perl6/atom-language-perl6 | ||||
| [submodule "vendor/grammars/reason"] | ||||
| 	path = vendor/grammars/reason | ||||
| 	url = https://github.com/facebook/reason | ||||
| [submodule "vendor/grammars/language-xcompose"] | ||||
| 	path = vendor/grammars/language-xcompose | ||||
| 	url = https://github.com/samcv/language-xcompose | ||||
| [submodule "vendor/grammars/SublimeEthereum"] | ||||
| 	path = vendor/grammars/SublimeEthereum | ||||
| 	url = https://github.com/davidhq/SublimeEthereum.git | ||||
| [submodule "vendor/grammars/atom-language-rust"] | ||||
| 	path = vendor/grammars/atom-language-rust | ||||
| 	url = https://github.com/zargony/atom-language-rust | ||||
| [submodule "vendor/grammars/language-css"] | ||||
| 	path = vendor/grammars/language-css | ||||
| 	url = https://github.com/atom/language-css | ||||
| [submodule "vendor/grammars/language-regexp"] | ||||
| 	path = vendor/grammars/language-regexp | ||||
| 	url = https://github.com/Alhadis/language-regexp | ||||
| [submodule "vendor/grammars/Terraform.tmLanguage"] | ||||
| 	path = vendor/grammars/Terraform.tmLanguage | ||||
| 	url = https://github.com/alexlouden/Terraform.tmLanguage | ||||
| [submodule "vendor/grammars/shaders-tmLanguage"] | ||||
| 	path = vendor/grammars/shaders-tmLanguage | ||||
| 	url = https://github.com/tgjones/shaders-tmLanguage | ||||
| [submodule "vendor/grammars/language-meson"] | ||||
| 	path = vendor/grammars/language-meson | ||||
| 	url = https://github.com/TingPing/language-meson | ||||
| [submodule "vendor/grammars/atom-language-p4"] | ||||
| 	path = vendor/grammars/atom-language-p4 | ||||
| 	url = https://github.com/TakeshiTseng/atom-language-p4 | ||||
| [submodule "vendor/grammars/language-jison"] | ||||
| 	path = vendor/grammars/language-jison | ||||
| 	url = https://github.com/cdibbs/language-jison | ||||
| [submodule "vendor/grammars/openscad.tmbundle"] | ||||
| 	path = vendor/grammars/openscad.tmbundle | ||||
| 	url = https://github.com/tbuser/openscad.tmbundle | ||||
| [submodule "vendor/grammars/marko-tmbundle"] | ||||
| 	path = vendor/grammars/marko-tmbundle | ||||
| 	url = https://github.com/marko-js/marko-tmbundle | ||||
|   | ||||
							
								
								
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,20 +1,33 @@ | ||||
| language: ruby | ||||
| sudo: false | ||||
|  | ||||
| addons: | ||||
|   apt: | ||||
|     packages: | ||||
|     - libicu-dev | ||||
|     - libicu48 | ||||
|  | ||||
| before_install: script/travis/before_install | ||||
|  | ||||
| script: | ||||
|   - bundle exec rake | ||||
|   - script/licensed verify | ||||
|  | ||||
| rvm: | ||||
|   - 2.0.0 | ||||
|   - 2.1 | ||||
|   - 2.2 | ||||
|   - 2.3.3 | ||||
|   - 2.4.0 | ||||
|  | ||||
| matrix: | ||||
|   allow_failures: | ||||
|   - rvm: 2.4.0 | ||||
|  | ||||
| notifications: | ||||
|   disabled: true | ||||
|  | ||||
| git: | ||||
|   submodules: false | ||||
|   depth: 3 | ||||
|  | ||||
| cache: bundler | ||||
|   | ||||
| @@ -17,7 +17,7 @@ To add support for a new extension: | ||||
| In addition, if this extension is already listed in [`languages.yml`][languages] then sometimes a few more steps will need to be taken: | ||||
|  | ||||
| 0. Make sure that example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.yourextension` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. If the Bayesian classifier does a bad job with the sample `.yourextension` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. | ||||
|  | ||||
|  | ||||
| @@ -36,7 +36,7 @@ To add support for a new language: | ||||
| In addition, if your new language defines an extension that's already listed in [`languages.yml`][languages] (such as `.foo`) then sometimes a few more steps will need to be taken: | ||||
|  | ||||
| 0. Make sure that example `.foo` files are present in the [samples directory][samples] for each language that uses `.foo`. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@arfon** or **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. Test the performance of the Bayesian classifier with a relatively large number (1000s) of sample `.foo` files. (ping **@bkeepers** to help with this) to ensure we're not misclassifying files. | ||||
| 0. If the Bayesian classifier does a bad job with the sample `.foo` files then a [heuristic](https://github.com/github/linguist/blob/master/lib/linguist/heuristics.rb) may need to be written to help. | ||||
|  | ||||
| Remember, the goal here is to try and avoid false positives! | ||||
| @@ -80,7 +80,6 @@ Here's our current build status: [ | ||||
| - **@larsbrinkhoff** | ||||
| - **@lildude** (GitHub staff) | ||||
|   | ||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Copyright (c) 2011-2016 GitHub, Inc. | ||||
| Copyright (c) 2017 GitHub, Inc. | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person | ||||
| obtaining a copy of this software and associated documentation | ||||
|   | ||||
| @@ -32,7 +32,7 @@ Linguist supports a number of different custom overrides strategies for language | ||||
|  | ||||
| ### Using gitattributes | ||||
|  | ||||
| Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics, but will not be used to syntax highlight files. To manually set syntax highlighting, use [Vim or Emacs modelines](#using-emacs-or-vim-modelines). | ||||
| Add a `.gitattributes` file to your project and use standard git-style path matchers for the files you want to override to set `linguist-documentation`, `linguist-language`, and `linguist-vendored`. `.gitattributes` will be used to determine language statistics and will be used to syntax highlight files. You can also manually set syntax highlighting using [Vim or Emacs modelines](#using-emacs-or-vim-modelines). | ||||
|  | ||||
| ``` | ||||
| $ cat .gitattributes | ||||
| @@ -71,7 +71,7 @@ See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/mas | ||||
|  | ||||
| ### Using Emacs or Vim modelines | ||||
|  | ||||
| Alternatively, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com | ||||
| If you do not want to use `.gitattributes` to override the syntax highlighting used on GitHub.com, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com | ||||
|  | ||||
| ##### Vim | ||||
| ``` | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| #!/usr/bin/env ruby | ||||
|  | ||||
| $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') | ||||
|  | ||||
| require 'linguist' | ||||
| require 'rugged' | ||||
| require 'optparse' | ||||
| @@ -102,10 +104,16 @@ def git_linguist(args) | ||||
|   commit = nil | ||||
|  | ||||
|   parser = OptionParser.new do |opts| | ||||
|     opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable" | ||||
|     opts.banner = <<-HELP | ||||
|     Linguist v#{Linguist::VERSION} | ||||
|     Detect language type and determine language breakdown for a given Git repository. | ||||
|  | ||||
|     Usage: | ||||
|     git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable" | ||||
|     HELP | ||||
|  | ||||
|     opts.on("-f", "--force", "Force a full rescan") { incremental = false } | ||||
|     opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v} | ||||
|     opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v} | ||||
|   end | ||||
|  | ||||
|   parser.parse!(args) | ||||
|   | ||||
							
								
								
									
										35
									
								
								bin/linguist
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								bin/linguist
									
									
									
									
									
								
							| @@ -1,29 +1,37 @@ | ||||
| #!/usr/bin/env ruby | ||||
|  | ||||
| # linguist — detect language type for a file, or, given a directory, determine language breakdown | ||||
| #     usage: linguist <path> [<--breakdown>] | ||||
| # | ||||
| $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') | ||||
|  | ||||
| require 'linguist' | ||||
| require 'rugged' | ||||
| require 'json' | ||||
| require 'optparse' | ||||
|  | ||||
| path = ARGV[0] || Dir.pwd | ||||
|  | ||||
| # special case if not given a directory but still given the --breakdown option | ||||
| # special case if not given a directory | ||||
| # but still given the --breakdown or --json options/ | ||||
| if path == "--breakdown" | ||||
|   path = Dir.pwd | ||||
|   breakdown = true | ||||
| elsif path == "--json" | ||||
|   path = Dir.pwd | ||||
|   json_breakdown = true | ||||
| end | ||||
|  | ||||
| ARGV.shift | ||||
| breakdown = true if ARGV[0] == "--breakdown" | ||||
| json_breakdown = true if ARGV[0] == "--json" | ||||
|  | ||||
| if File.directory?(path) | ||||
|   rugged = Rugged::Repository.new(path) | ||||
|   repo = Linguist::Repository.new(rugged, rugged.head.target_id) | ||||
|   repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| | ||||
|     percentage = ((size / repo.size.to_f) * 100) | ||||
|     percentage = sprintf '%.2f' % percentage | ||||
|     puts "%-7s %s" % ["#{percentage}%", language] | ||||
|   if !json_breakdown | ||||
|     repo.languages.sort_by { |_, size| size }.reverse.each do |language, size| | ||||
|       percentage = ((size / repo.size.to_f) * 100) | ||||
|       percentage = sprintf '%.2f' % percentage | ||||
|       puts "%-7s %s" % ["#{percentage}%", language] | ||||
|     end | ||||
|   end | ||||
|   if breakdown | ||||
|     puts | ||||
| @@ -35,6 +43,8 @@ if File.directory?(path) | ||||
|       end | ||||
|       puts | ||||
|     end | ||||
|   elsif json_breakdown | ||||
|     puts JSON.dump(repo.breakdown_by_file) | ||||
|   end | ||||
| elsif File.file?(path) | ||||
|   blob = Linguist::FileBlob.new(path, Dir.pwd) | ||||
| @@ -63,5 +73,12 @@ elsif File.file?(path) | ||||
|     puts "  appears to be a vendored file" | ||||
|   end | ||||
| else | ||||
|   abort "usage: linguist <path>" | ||||
|   abort <<-HELP | ||||
|   Linguist v#{Linguist::VERSION} | ||||
|   Detect language type for a file, or, given a directory, determine language breakdown. | ||||
|  | ||||
|   Usage: linguist <path> | ||||
|          linguist <path> [--breakdown] [--json] | ||||
|          linguist [--breakdown] [--json] | ||||
|   HELP | ||||
| end | ||||
|   | ||||
| @@ -16,7 +16,7 @@ Gem::Specification.new do |s| | ||||
|   s.add_dependency 'charlock_holmes', '~> 0.7.3' | ||||
|   s.add_dependency 'escape_utils',    '~> 1.1.0' | ||||
|   s.add_dependency 'mime-types',      '>= 1.19' | ||||
|   s.add_dependency 'rugged',          '>= 0.23.0b' | ||||
|   s.add_dependency 'rugged',          '>= 0.25.1' | ||||
|  | ||||
|   s.add_development_dependency 'minitest', '>= 5.0' | ||||
|   s.add_development_dependency 'mocha' | ||||
| @@ -26,5 +26,5 @@ Gem::Specification.new do |s| | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
|   s.add_development_dependency 'color-proximity', '~> 0.2.1' | ||||
|   s.add_development_dependency 'licensed' | ||||
|   s.add_development_dependency 'licensee', '>= 8.6.0' | ||||
|   s.add_development_dependency 'licensee', '~> 8.8.0' | ||||
| end | ||||
|   | ||||
							
								
								
									
										61
									
								
								grammars.yml
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								grammars.yml
									
									
									
									
									
								
							| @@ -1,9 +1,9 @@ | ||||
| --- | ||||
| http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage: | ||||
| - text.xml.genshi | ||||
| https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz: | ||||
| - source.systemverilog | ||||
| - source.ucfconstraints | ||||
| https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage: | ||||
| - text.xml.genshi | ||||
| vendor/grammars/ABNF.tmbundle: | ||||
| - source.abnf | ||||
| vendor/grammars/Agda.tmbundle: | ||||
| @@ -56,6 +56,8 @@ vendor/grammars/MQL5-sublime: | ||||
| vendor/grammars/MagicPython: | ||||
| - source.python | ||||
| - source.regexp.python | ||||
| - text.python.console | ||||
| - text.python.traceback | ||||
| vendor/grammars/Modelica: | ||||
| - source.modelica | ||||
| vendor/grammars/NSIS: | ||||
| @@ -113,7 +115,9 @@ vendor/grammars/SublimeBrainfuck: | ||||
| - source.bf | ||||
| vendor/grammars/SublimeClarion: | ||||
| - source.clarion | ||||
| vendor/grammars/SublimeGDB: | ||||
| vendor/grammars/SublimeEthereum: | ||||
| - source.solidity | ||||
| vendor/grammars/SublimeGDB/: | ||||
| - source.disasm | ||||
| - source.gdb | ||||
| - source.gdb.session | ||||
| @@ -128,6 +132,8 @@ vendor/grammars/TLA: | ||||
| - source.tla | ||||
| vendor/grammars/TXL: | ||||
| - source.txl | ||||
| vendor/grammars/Terraform.tmLanguage: | ||||
| - source.terraform | ||||
| vendor/grammars/Textmate-Gosu-Bundle: | ||||
| - source.gosu.2 | ||||
| vendor/grammars/UrWeb-Language-Definition: | ||||
| @@ -178,8 +184,18 @@ vendor/grammars/atom-language-1c-bsl: | ||||
| - source.sdbl | ||||
| vendor/grammars/atom-language-clean: | ||||
| - source.clean | ||||
| - source.gfm.clean | ||||
| vendor/grammars/atom-language-p4: | ||||
| - source.p4 | ||||
| vendor/grammars/atom-language-perl6: | ||||
| - source.meta-info | ||||
| - source.perl6fe | ||||
| - source.quoting.perl6fe | ||||
| - source.regexp.perl6fe | ||||
| vendor/grammars/atom-language-purescript: | ||||
| - source.purescript | ||||
| vendor/grammars/atom-language-rust: | ||||
| - source.rust | ||||
| vendor/grammars/atom-language-srt: | ||||
| - text.srt | ||||
| vendor/grammars/atom-language-stan: | ||||
| @@ -211,7 +227,6 @@ vendor/grammars/capnproto.tmbundle: | ||||
| vendor/grammars/carto-atom: | ||||
| - source.css.mss | ||||
| vendor/grammars/ceylon-sublimetext: | ||||
| - module.ceylon | ||||
| - source.ceylon | ||||
| vendor/grammars/chapel-tmbundle: | ||||
| - source.chapel | ||||
| @@ -225,8 +240,6 @@ vendor/grammars/cpp-qt.tmbundle: | ||||
| - source.qmake | ||||
| vendor/grammars/creole: | ||||
| - text.html.creole | ||||
| vendor/grammars/css.tmbundle: | ||||
| - source.css | ||||
| vendor/grammars/cucumber-tmbundle: | ||||
| - source.ruby.rspec.cucumber.steps | ||||
| - text.gherkin.feature | ||||
| @@ -360,6 +373,8 @@ vendor/grammars/language-csound: | ||||
| - source.csound | ||||
| - source.csound-document | ||||
| - source.csound-score | ||||
| vendor/grammars/language-css: | ||||
| - source.css | ||||
| vendor/grammars/language-emacs-lisp: | ||||
| - source.emacs.lisp | ||||
| vendor/grammars/language-fontforge: | ||||
| @@ -384,14 +399,17 @@ vendor/grammars/language-haskell: | ||||
| - source.haskell | ||||
| - source.hsc2hs | ||||
| - text.tex.latex.haskell | ||||
| vendor/grammars/language-hy: | ||||
| - source.hy | ||||
| vendor/grammars/language-inform7: | ||||
| - source.inform7 | ||||
| vendor/grammars/language-javascript: | ||||
| - source.js | ||||
| - source.js.regexp | ||||
| - source.js.regexp.replacement | ||||
| - source.jsdoc | ||||
| vendor/grammars/language-jison: | ||||
| - source.jison | ||||
| - source.jisonlex | ||||
| - source.jisonlex-injection | ||||
| vendor/grammars/language-jsoniq: | ||||
| - source.jq | ||||
| - source.xq | ||||
| @@ -399,20 +417,24 @@ vendor/grammars/language-less: | ||||
| - source.css.less | ||||
| vendor/grammars/language-maxscript: | ||||
| - source.maxscript | ||||
| vendor/grammars/language-meson: | ||||
| - source.meson | ||||
| vendor/grammars/language-ncl: | ||||
| - source.ncl | ||||
| vendor/grammars/language-ninja: | ||||
| - source.ninja | ||||
| vendor/grammars/language-povray: | ||||
| - source.pov-ray sdl | ||||
| vendor/grammars/language-python: | ||||
| - text.python.console | ||||
| - text.python.traceback | ||||
| vendor/grammars/language-regexp: | ||||
| - source.regexp | ||||
| - source.regexp.extended | ||||
| vendor/grammars/language-renpy: | ||||
| - source.renpy | ||||
| vendor/grammars/language-restructuredtext: | ||||
| - text.restructuredtext | ||||
| vendor/grammars/language-roff: | ||||
| - source.ditroff | ||||
| - source.ditroff.desc | ||||
| - source.ideal | ||||
| - source.pic | ||||
| - text.roff | ||||
| @@ -436,6 +458,8 @@ vendor/grammars/language-wavefront: | ||||
| - source.wavefront.obj | ||||
| vendor/grammars/language-xbase: | ||||
| - source.harbour | ||||
| vendor/grammars/language-xcompose: | ||||
| - config.xcompose | ||||
| vendor/grammars/language-yaml: | ||||
| - source.yaml | ||||
| vendor/grammars/language-yang: | ||||
| @@ -465,6 +489,8 @@ vendor/grammars/make.tmbundle: | ||||
| - source.makefile | ||||
| vendor/grammars/mako-tmbundle: | ||||
| - text.html.mako | ||||
| vendor/grammars/marko-tmbundle: | ||||
| - text.marko | ||||
| vendor/grammars/mathematica-tmbundle: | ||||
| - source.mathematica | ||||
| vendor/grammars/matlab.tmbundle: | ||||
| @@ -502,6 +528,8 @@ vendor/grammars/ooc.tmbundle: | ||||
| - source.ooc | ||||
| vendor/grammars/opa.tmbundle: | ||||
| - source.opa | ||||
| vendor/grammars/openscad.tmbundle: | ||||
| - source.scad | ||||
| vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage: | ||||
| - source.oz | ||||
| vendor/grammars/parrot: | ||||
| @@ -513,10 +541,6 @@ vendor/grammars/pawn-sublime-language: | ||||
| vendor/grammars/perl.tmbundle: | ||||
| - source.perl | ||||
| - source.perl.6 | ||||
| vendor/grammars/perl6fe: | ||||
| - source.meta-info | ||||
| - source.perl6fe | ||||
| - source.regexp.perl6fe | ||||
| vendor/grammars/php-smarty.tmbundle: | ||||
| - text.html.smarty | ||||
| vendor/grammars/php.tmbundle: | ||||
| @@ -541,6 +565,8 @@ vendor/grammars/r.tmbundle: | ||||
| - text.tex.latex.rd | ||||
| vendor/grammars/rascal-syntax-highlighting: | ||||
| - source.rascal | ||||
| vendor/grammars/reason: | ||||
| - source.reason | ||||
| vendor/grammars/ruby-slim.tmbundle: | ||||
| - text.slim | ||||
| vendor/grammars/ruby.tmbundle: | ||||
| @@ -560,6 +586,9 @@ vendor/grammars/scilab.tmbundle: | ||||
| - source.scilab | ||||
| vendor/grammars/secondlife-lsl: | ||||
| - source.lsl | ||||
| vendor/grammars/shaders-tmLanguage: | ||||
| - source.hlsl | ||||
| - source.shaderlab | ||||
| vendor/grammars/smali-sublime: | ||||
| - source.smali | ||||
| vendor/grammars/smalltalk-tmbundle: | ||||
| @@ -608,8 +637,6 @@ vendor/grammars/sublime-rexx: | ||||
| - source.rexx | ||||
| vendor/grammars/sublime-robot-plugin: | ||||
| - text.robot | ||||
| vendor/grammars/sublime-rust: | ||||
| - source.rust | ||||
| vendor/grammars/sublime-spintools: | ||||
| - source.regexp.spin | ||||
| - source.spin | ||||
|   | ||||
| @@ -15,9 +15,9 @@ class << Linguist | ||||
|   #       see Linguist::LazyBlob and Linguist::FileBlob for examples | ||||
|   # | ||||
|   # Returns Language or nil. | ||||
|   def detect(blob) | ||||
|   def detect(blob, allow_empty: false) | ||||
|     # Bail early if the blob is binary or empty. | ||||
|     return nil if blob.likely_binary? || blob.binary? || blob.empty? | ||||
|     return nil if blob.likely_binary? || blob.binary? || (!allow_empty && blob.empty?) | ||||
|  | ||||
|     Linguist.instrument("linguist.detection", :blob => blob) do | ||||
|       # Call each strategy until one candidate is returned. | ||||
|   | ||||
| @@ -95,7 +95,7 @@ module Linguist | ||||
|     # Returns sorted Array of result pairs. Each pair contains the | ||||
|     # String language name and a Float score. | ||||
|     def classify(tokens, languages) | ||||
|       return [] if tokens.nil? | ||||
|       return [] if tokens.nil? || languages.empty? | ||||
|       tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String) | ||||
|       scores = {} | ||||
|  | ||||
|   | ||||
| @@ -9,11 +9,12 @@ | ||||
|  | ||||
| ## Documentation directories ## | ||||
|  | ||||
| - ^docs?/ | ||||
| - ^[Dd]ocs?/ | ||||
| - (^|/)[Dd]ocumentation/ | ||||
| - (^|/)javadoc/ | ||||
| - ^man/ | ||||
| - (^|/)[Jj]avadoc/ | ||||
| - ^[Mm]an/ | ||||
| - ^[Ee]xamples/ | ||||
| - ^[Dd]emos?/ | ||||
|  | ||||
| ## Documentation files ## | ||||
|  | ||||
| @@ -27,4 +28,4 @@ | ||||
| - (^|/)[Rr]eadme(\.|$) | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
| - ^[Ss]amples?/ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module Linguist | ||||
|     # Public: Is the blob a generated file? | ||||
|     # | ||||
|     # name - String filename | ||||
|     # data - String blob data. A block also maybe passed in for lazy | ||||
|     # data - String blob data. A block also may be passed in for lazy | ||||
|     #        loading. This behavior is deprecated and you should always | ||||
|     #        pass in a String. | ||||
|     # | ||||
| @@ -70,6 +70,7 @@ module Linguist | ||||
|       compiled_cython_file? || | ||||
|       generated_go? || | ||||
|       generated_protocol_buffer? || | ||||
|       generated_javascript_protocol_buffer? || | ||||
|       generated_apache_thrift? || | ||||
|       generated_jni_header? || | ||||
|       vcr_cassette? || | ||||
| @@ -77,7 +78,10 @@ module Linguist | ||||
|       generated_unity3d_meta? || | ||||
|       generated_racc? || | ||||
|       generated_jflex? || | ||||
|       generated_grammarkit? | ||||
|       generated_grammarkit? || | ||||
|       generated_roxygen2? || | ||||
|       generated_jison? || | ||||
|       generated_yarn_lock? | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob an Xcode file? | ||||
| @@ -275,6 +279,17 @@ module Linguist | ||||
|       return lines[0].include?("Generated by the protocol buffer compiler.  DO NOT EDIT!") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a Javascript source file generated by the | ||||
|     # Protocol Buffer compiler? | ||||
|     # | ||||
|     # Returns true of false. | ||||
|     def generated_javascript_protocol_buffer? | ||||
|       return false unless extname == ".js" | ||||
|       return false unless lines.count > 6 | ||||
|  | ||||
|       return lines[5].include?("GENERATED CODE -- DO NOT EDIT!") | ||||
|     end | ||||
|  | ||||
|     APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php'] | ||||
|  | ||||
|     # Internal: Is the blob generated by Apache Thrift compiler? | ||||
| @@ -311,7 +326,7 @@ module Linguist | ||||
|       !!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(?<!-)\.)+(com|edu|gov|in|me|net|org|fm|io)/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated npm shrinkwrap file. | ||||
|     # Internal: Is the blob a generated npm shrinkwrap file? | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def npm_shrinkwrap? | ||||
| @@ -333,7 +348,7 @@ module Linguist | ||||
|       !!name.match(/composer\.lock/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated by Zephir | ||||
|     # Internal: Is the blob generated by Zephir? | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def generated_by_zephir? | ||||
| @@ -433,5 +448,46 @@ module Linguist | ||||
|       return false unless lines.count > 1 | ||||
|       return lines[0].start_with?("// This is a generated file. Not intended for manual editing.") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a roxygen2-generated file? | ||||
|     # | ||||
|     # A roxygen2-generated file typically contain: | ||||
|     # % Generated by roxygen2: do not edit by hand | ||||
|     # on the first line. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_roxygen2? | ||||
|       return false unless extname == '.Rd' | ||||
|       return false unless lines.count > 1 | ||||
|  | ||||
|       return lines[0].include?("% Generated by roxygen2: do not edit by hand") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is this a Jison-generated file? | ||||
|     # | ||||
|     # Jison-generated parsers typically contain: | ||||
|     # /* parser generated by jison | ||||
|     # on the first line. | ||||
|     # | ||||
|     # Jison-generated lexers typically contain: | ||||
|     # /* generated by jison-lex | ||||
|     # on the first line. | ||||
|     # | ||||
|     # Return true or false | ||||
|     def generated_jison? | ||||
|       return false unless extname == '.js' | ||||
|       return false unless lines.count > 1 | ||||
|       return lines[0].start_with?("/* parser generated by jison ") || | ||||
|              lines[0].start_with?("/* generated by jison-lex ") | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated yarn lockfile? | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def generated_yarn_lock? | ||||
|       return false unless name.match(/yarn\.lock/) | ||||
|       return false unless lines.count > 0 | ||||
|       return lines[0].include?("# THIS IS AN AUTOGENERATED FILE") | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -260,10 +260,12 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".md" do |data| | ||||
|       if /(^[-a-z0-9=#!\*\[|])|<\//i.match(data) || data.empty? | ||||
|       if /(^[-a-z0-9=#!\*\[|>])|<\//i.match(data) || data.empty? | ||||
|         Language["Markdown"] | ||||
|       elsif /^(;;|\(define_)/.match(data) | ||||
|         Language["GCC machine description"] | ||||
|       else | ||||
|         Language["Markdown"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -278,7 +280,7 @@ module Linguist | ||||
|     disambiguate ".mod" do |data| | ||||
|       if data.include?('<!ENTITY ') | ||||
|         Language["XML"] | ||||
|       elsif /MODULE\s\w+\s*;/i.match(data) || /^\s*END \w+;$/i.match(data) | ||||
|       elsif /^\s*MODULE [\w\.]+;/i.match(data) || /^\s*END [\w\.]+;/i.match(data) | ||||
|         Language["Modula-2"] | ||||
|       else | ||||
|         [Language["Linux Kernel Module"], Language["AMPL"]] | ||||
| @@ -326,7 +328,7 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     disambiguate ".pl" do |data| | ||||
|       if /^[^#]+:-/.match(data) | ||||
|       if /^[^#]*:-/.match(data) | ||||
|         Language["Prolog"] | ||||
|       elsif /use strict|use\s+v?5\./.match(data) | ||||
|         Language["Perl"] | ||||
| @@ -465,5 +467,13 @@ module Linguist | ||||
|         Language["Scilab"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate ".tsx" do |data| | ||||
|       if /^\s*(import.+(from\s+|require\()['"]react|\/\/\/\s*<reference\s)/.match(data) | ||||
|         Language["TypeScript"] | ||||
|       elsif /^\s*<\?xml\s+version/i.match(data) | ||||
|         Language["XML"] | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -215,7 +215,14 @@ module Linguist | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.[](name) | ||||
|       return nil if name.to_s.empty? | ||||
|       name && (@index[name.downcase] || @index[name.split(',').first.downcase]) | ||||
|  | ||||
|       lang = @index[name.downcase] | ||||
|       return lang if lang | ||||
|  | ||||
|       name = name.split(',').first | ||||
|       return nil if name.to_s.empty? | ||||
|  | ||||
|       @index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: A List of popular languages | ||||
| @@ -265,7 +272,7 @@ module Linguist | ||||
|       @color = attributes[:color] | ||||
|  | ||||
|       # Set aliases | ||||
|       @aliases = [default_alias_name] + (attributes[:aliases] || []) | ||||
|       @aliases = [default_alias] + (attributes[:aliases] || []) | ||||
|  | ||||
|       # Load the TextMate scope name or try to guess one | ||||
|       @tm_scope = attributes[:tm_scope] || begin | ||||
| @@ -283,9 +290,6 @@ module Linguist | ||||
|       @codemirror_mime_type = attributes[:codemirror_mime_type] | ||||
|       @wrap = attributes[:wrap] || false | ||||
|  | ||||
|       # Set legacy search term | ||||
|       @search_term = attributes[:search_term] || default_alias_name | ||||
|  | ||||
|       # Set the language_id | ||||
|       @language_id = attributes[:language_id] | ||||
|  | ||||
| @@ -437,12 +441,13 @@ module Linguist | ||||
|       EscapeUtils.escape_url(name).gsub('+', '%20') | ||||
|     end | ||||
|  | ||||
|     # Internal: Get default alias name | ||||
|     # Public: Get default alias name | ||||
|     # | ||||
|     # Returns the alias name String | ||||
|     def default_alias_name | ||||
|     def default_alias | ||||
|       name.downcase.gsub(/\s/, '-') | ||||
|     end | ||||
|     alias_method :default_alias_name, :default_alias | ||||
|  | ||||
|     # Public: Get Language group | ||||
|     # | ||||
| @@ -557,7 +562,6 @@ module Linguist | ||||
|       :wrap              => options['wrap'], | ||||
|       :group_name        => options['group'], | ||||
|       :searchable        => options.fetch('searchable', true), | ||||
|       :search_term       => options['search_term'], | ||||
|       :language_id       => options['language_id'], | ||||
|       :extensions        => Array(options['extensions']), | ||||
|       :interpreters      => options['interpreters'].sort, | ||||
|   | ||||
| @@ -499,6 +499,7 @@ C++: | ||||
|   - ".inc" | ||||
|   - ".inl" | ||||
|   - ".ipp" | ||||
|   - ".re" | ||||
|   - ".tcc" | ||||
|   - ".tpp" | ||||
|   language_id: 43 | ||||
| @@ -1120,6 +1121,7 @@ Emacs Lisp: | ||||
|   - ".gnus" | ||||
|   - ".spacemacs" | ||||
|   - ".viper" | ||||
|   - Cask | ||||
|   - Project.ede | ||||
|   - _emacs | ||||
|   - abbrev_defs | ||||
| @@ -1154,6 +1156,7 @@ Erlang: | ||||
|   - ".xrl" | ||||
|   - ".yrl" | ||||
|   filenames: | ||||
|   - Emakefile | ||||
|   - rebar.config | ||||
|   - rebar.config.lock | ||||
|   - rebar.lock | ||||
| @@ -1384,6 +1387,14 @@ Game Maker Language: | ||||
|   codemirror_mode: clike | ||||
|   codemirror_mime_type: text/x-c++src | ||||
|   language_id: 125 | ||||
| Genie: | ||||
|   type: programming | ||||
|   ace_mode: text | ||||
|   extensions: | ||||
|   - ".gs" | ||||
|   color: "#fb855d" | ||||
|   tm_scope: none | ||||
|   language_id: 792408528 | ||||
| Genshi: | ||||
|   type: programming | ||||
|   extensions: | ||||
| @@ -1577,7 +1588,7 @@ HCL: | ||||
|   ace_mode: ruby | ||||
|   codemirror_mode: ruby | ||||
|   codemirror_mime_type: text/x-ruby | ||||
|   tm_scope: source.ruby | ||||
|   tm_scope: source.terraform | ||||
|   language_id: 144 | ||||
| HLSL: | ||||
|   type: programming | ||||
| @@ -1587,7 +1598,7 @@ HLSL: | ||||
|   - ".fxh" | ||||
|   - ".hlsli" | ||||
|   ace_mode: text | ||||
|   tm_scope: none | ||||
|   tm_scope: source.hlsl | ||||
|   language_id: 145 | ||||
| HTML: | ||||
|   type: markup | ||||
| @@ -1595,7 +1606,7 @@ HTML: | ||||
|   ace_mode: html | ||||
|   codemirror_mode: htmlmixed | ||||
|   codemirror_mime_type: text/html | ||||
|   color: "#e44b23" | ||||
|   color: "#e34c26" | ||||
|   aliases: | ||||
|   - xhtml | ||||
|   extensions: | ||||
| @@ -1754,7 +1765,7 @@ Hy: | ||||
|   - ".hy" | ||||
|   aliases: | ||||
|   - hylang | ||||
|   tm_scope: source.hy | ||||
|   tm_scope: none | ||||
|   language_id: 159 | ||||
| HyPhy: | ||||
|   type: programming | ||||
| @@ -2012,6 +2023,22 @@ JavaScript: | ||||
|   interpreters: | ||||
|   - node | ||||
|   language_id: 183 | ||||
| Jison: | ||||
|   type: programming | ||||
|   group: Yacc | ||||
|   extensions: | ||||
|   - ".jison" | ||||
|   tm_scope: source.jison | ||||
|   ace_mode: text | ||||
|   language_id: 284531423 | ||||
| Jison Lex: | ||||
|   type: programming | ||||
|   group: Lex | ||||
|   extensions: | ||||
|   - ".jisonlex" | ||||
|   tm_scope: source.jisonlex | ||||
|   ace_mode: text | ||||
|   language_id: 406395330 | ||||
| Julia: | ||||
|   type: programming | ||||
|   extensions: | ||||
| @@ -2281,6 +2308,8 @@ LookML: | ||||
|   color: "#652B81" | ||||
|   extensions: | ||||
|   - ".lookml" | ||||
|   - ".model.lkml" | ||||
|   - ".view.lkml" | ||||
|   tm_scope: source.yaml | ||||
|   language_id: 211 | ||||
| LoomScript: | ||||
| @@ -2427,6 +2456,8 @@ Mako: | ||||
|   language_id: 221 | ||||
| Markdown: | ||||
|   type: prose | ||||
|   aliases: | ||||
|   - pandoc | ||||
|   ace_mode: markdown | ||||
|   codemirror_mode: gfm | ||||
|   codemirror_mime_type: text/x-gfm | ||||
| @@ -2434,12 +2465,26 @@ Markdown: | ||||
|   extensions: | ||||
|   - ".md" | ||||
|   - ".markdown" | ||||
|   - ".mdown" | ||||
|   - ".mdwn" | ||||
|   - ".mkd" | ||||
|   - ".mkdn" | ||||
|   - ".mkdown" | ||||
|   - ".ron" | ||||
|   tm_scope: source.gfm | ||||
|   language_id: 222 | ||||
| Marko: | ||||
|   group: HTML | ||||
|   type: markup | ||||
|   tm_scope: text.marko | ||||
|   extensions: | ||||
|   - ".marko" | ||||
|   aliases: | ||||
|   - markojs | ||||
|   ace_mode: text | ||||
|   codemirror_mode: htmlmixed | ||||
|   codemirror_mime_type: text/html | ||||
|   language_id: 932782397 | ||||
| Mask: | ||||
|   type: markup | ||||
|   color: "#f97732" | ||||
| @@ -2524,6 +2569,15 @@ Mercury: | ||||
|   - ".moo" | ||||
|   tm_scope: source.mercury | ||||
|   language_id: 229 | ||||
| Meson: | ||||
|   type: programming | ||||
|   color: "#007800" | ||||
|   filenames: | ||||
|   - meson.build | ||||
|   - meson_options.txt | ||||
|   tm_scope: source.meson | ||||
|   ace_mode: text | ||||
|   language_id: 799141244 | ||||
| Metal: | ||||
|   type: programming | ||||
|   color: "#8f14e9" | ||||
| @@ -2892,7 +2946,7 @@ OpenSCAD: | ||||
|   type: programming | ||||
|   extensions: | ||||
|   - ".scad" | ||||
|   tm_scope: none | ||||
|   tm_scope: source.scad | ||||
|   ace_mode: scad | ||||
|   language_id: 266 | ||||
| OpenType Feature File: | ||||
| @@ -2939,6 +2993,14 @@ Oz: | ||||
|   codemirror_mode: oz | ||||
|   codemirror_mime_type: text/x-oz | ||||
|   language_id: 270 | ||||
| P4: | ||||
|   type: programming | ||||
|   color: "#7055b5" | ||||
|   extensions: | ||||
|   - ".p4" | ||||
|   tm_scope: source.p4 | ||||
|   ace_mode: text | ||||
|   language_id: 348895984 | ||||
| PAWN: | ||||
|   type: programming | ||||
|   color: "#dbb284" | ||||
| @@ -3216,6 +3278,7 @@ PowerBuilder: | ||||
|   language_id: 292 | ||||
| PowerShell: | ||||
|   type: programming | ||||
|   color: "#012456" | ||||
|   ace_mode: powershell | ||||
|   codemirror_mode: powershell | ||||
|   codemirror_mime_type: application/x-powershell | ||||
| @@ -3358,6 +3421,7 @@ Python: | ||||
|   - SConscript | ||||
|   - SConstruct | ||||
|   - Snakefile | ||||
|   - WORKSPACE | ||||
|   - wscript | ||||
|   interpreters: | ||||
|   - python | ||||
| @@ -3548,6 +3612,19 @@ Raw token data: | ||||
|   tm_scope: none | ||||
|   ace_mode: text | ||||
|   language_id: 318 | ||||
| Reason: | ||||
|   type: programming | ||||
|   group: OCaml | ||||
|   ace_mode: rust | ||||
|   codemirror_mode: rust | ||||
|   codemirror_mime_type: text/x-rustsrc | ||||
|   extensions: | ||||
|   - ".re" | ||||
|   - ".rei" | ||||
|   interpreters: | ||||
|   - ocaml | ||||
|   tm_scope: source.reason | ||||
|   language_id: 869538413 | ||||
| Rebol: | ||||
|   type: programming | ||||
|   color: "#358a5b" | ||||
| @@ -3578,6 +3655,17 @@ Redcode: | ||||
|   tm_scope: none | ||||
|   ace_mode: text | ||||
|   language_id: 321 | ||||
| Regular Expression: | ||||
|   type: data | ||||
|   extensions: | ||||
|   - ".regexp" | ||||
|   - ".regex" | ||||
|   aliases: | ||||
|   - regexp | ||||
|   - regex | ||||
|   ace_mode: text | ||||
|   tm_scope: source.regexp | ||||
|   language_id: 363378884 | ||||
| Ren'Py: | ||||
|   type: programming | ||||
|   aliases: | ||||
| @@ -3666,6 +3754,7 @@ Ruby: | ||||
|   extensions: | ||||
|   - ".rb" | ||||
|   - ".builder" | ||||
|   - ".eye" | ||||
|   - ".fcgi" | ||||
|   - ".gemspec" | ||||
|   - ".god" | ||||
| @@ -3790,6 +3879,7 @@ SQL: | ||||
|   - ".cql" | ||||
|   - ".ddl" | ||||
|   - ".inc" | ||||
|   - ".mysql" | ||||
|   - ".prc" | ||||
|   - ".tab" | ||||
|   - ".udf" | ||||
| @@ -4274,12 +4364,16 @@ Text: | ||||
|   - ".no" | ||||
|   filenames: | ||||
|   - COPYING | ||||
|   - COPYRIGHT.regex | ||||
|   - FONTLOG | ||||
|   - INSTALL | ||||
|   - INSTALL.mysql | ||||
|   - LICENSE | ||||
|   - LICENSE.mysql | ||||
|   - NEWS | ||||
|   - README.1ST | ||||
|   - README.me | ||||
|   - README.mysql | ||||
|   - click.me | ||||
|   - delete.me | ||||
|   - keep.me | ||||
| @@ -4566,6 +4660,15 @@ XC: | ||||
|   codemirror_mode: clike | ||||
|   codemirror_mime_type: text/x-csrc | ||||
|   language_id: 398 | ||||
| XCompose: | ||||
|   type: data | ||||
|   filenames: | ||||
|   - ".XCompose" | ||||
|   - XCompose | ||||
|   - xcompose | ||||
|   tm_scope: config.xcompose | ||||
|   ace_mode: text | ||||
|   language_id: 225167241 | ||||
| XML: | ||||
|   type: data | ||||
|   ace_mode: xml | ||||
| @@ -4644,6 +4747,7 @@ XML: | ||||
|   - ".vcxproj" | ||||
|   - ".vssettings" | ||||
|   - ".vxml" | ||||
|   - ".wixproj" | ||||
|   - ".wsdl" | ||||
|   - ".wsf" | ||||
|   - ".wxi" | ||||
| @@ -4759,6 +4863,7 @@ YAML: | ||||
|   - ".syntax" | ||||
|   - ".yaml" | ||||
|   - ".yaml-tmlanguage" | ||||
|   - ".yml.mysql" | ||||
|   filenames: | ||||
|   - ".clang-format" | ||||
|   ace_mode: yaml | ||||
|   | ||||
| @@ -238,6 +238,12 @@ | ||||
| # BuddyBuild | ||||
| - BuddyBuildSDK.framework/ | ||||
|  | ||||
| # Realm | ||||
| - Realm.framework | ||||
|  | ||||
| # RealmSwift | ||||
| - RealmSwift.framework | ||||
|  | ||||
| # git config files | ||||
| - gitattributes$ | ||||
| - gitignore$ | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "5.0.0" | ||||
|   VERSION = "5.0.8" | ||||
| end | ||||
|   | ||||
							
								
								
									
										46
									
								
								samples/C++/bug1163046.--skeleton.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/C++/bug1163046.--skeleton.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| #include <iostream> | ||||
|  | ||||
| #define YYCTYPE unsigned char | ||||
| #define YYCURSOR cursor | ||||
| #define YYLIMIT cursor | ||||
| #define YYMARKER marker | ||||
| #define YYFILL(n) | ||||
|  | ||||
| bool scan(const char *text) | ||||
| { | ||||
| 	YYCTYPE *start = (YYCTYPE *)text; | ||||
| 	YYCTYPE *cursor = (YYCTYPE *)text; | ||||
| 	YYCTYPE *marker = (YYCTYPE *)text; | ||||
| next: | ||||
| 	YYCTYPE *token = cursor; | ||||
| /*!re2c | ||||
| '(This file must be converted with BinHex 4.0)' | ||||
| 	{ | ||||
| 		if (token == start || *(token - 1) == '\n') | ||||
| 		return true; else goto next; | ||||
| 	} | ||||
| [\001-\377] | ||||
| 	{ goto next; } | ||||
| [\000] | ||||
| 	{ return false; } | ||||
| */ | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| #define do_scan(str, expect) \ | ||||
| 	res = scan(str) == expect ? 0 : 1; \ | ||||
| 	std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \ | ||||
| 	result += res | ||||
|  | ||||
| /*!max:re2c */ | ||||
|  | ||||
| int main(int,void**) | ||||
| { | ||||
| 	int res, result = 0; | ||||
| 	do_scan("(This file must be converted with BinHex 4.0)", 1); | ||||
| 	do_scan("x(This file must be converted with BinHex 4.0)", 0); | ||||
| 	do_scan("(This file must be converted with BinHex 4.0)x", 1); | ||||
| 	do_scan("x(This file must be converted with BinHex 4.0)x", 0); | ||||
| 	 | ||||
| 	return result; | ||||
| } | ||||
							
								
								
									
										239
									
								
								samples/C++/cnokw.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/C++/cnokw.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #define	ADDEQ	257 | ||||
| #define	ANDAND	258 | ||||
| #define	ANDEQ	259 | ||||
| #define	ARRAY	260 | ||||
| #define	ASM	261 | ||||
| #define	AUTO	262 | ||||
| #define	BREAK	263 | ||||
| #define	CASE	264 | ||||
| #define	CHAR	265 | ||||
| #define	CONST	266 | ||||
| #define	CONTINUE	267 | ||||
| #define	DECR	268 | ||||
| #define	DEFAULT	269 | ||||
| #define	DEREF	270 | ||||
| #define	DIVEQ	271 | ||||
| #define	DO	272 | ||||
| #define	DOUBLE	273 | ||||
| #define	ELLIPSIS	274 | ||||
| #define	ELSE	275 | ||||
| #define	ENUM	276 | ||||
| #define	EQL	277 | ||||
| #define	EXTERN	278 | ||||
| #define	FCON	279 | ||||
| #define	FLOAT	280 | ||||
| #define	FOR	281 | ||||
| #define	FUNCTION	282 | ||||
| #define	GEQ	283 | ||||
| #define	GOTO	284 | ||||
| #define	ICON	285 | ||||
| #define	ID	286 | ||||
| #define	IF	287 | ||||
| #define	INCR	288 | ||||
| #define	INT	289 | ||||
| #define	LEQ	290 | ||||
| #define	LONG	291 | ||||
| #define	LSHIFT	292 | ||||
| #define	LSHIFTEQ	293 | ||||
| #define	MODEQ	294 | ||||
| #define	MULEQ	295 | ||||
| #define	NEQ	296 | ||||
| #define	OREQ	297 | ||||
| #define	OROR	298 | ||||
| #define	POINTER	299 | ||||
| #define	REGISTER	300 | ||||
| #define	RETURN	301 | ||||
| #define	RSHIFT	302 | ||||
| #define	RSHIFTEQ	303 | ||||
| #define	SCON	304 | ||||
| #define	SHORT	305 | ||||
| #define	SIGNED	306 | ||||
| #define	SIZEOF	307 | ||||
| #define	STATIC	308 | ||||
| #define	STRUCT	309 | ||||
| #define	SUBEQ	310 | ||||
| #define	SWITCH	311 | ||||
| #define	TYPEDEF	312 | ||||
| #define	UNION	313 | ||||
| #define	UNSIGNED	314 | ||||
| #define	VOID	315 | ||||
| #define	VOLATILE	316 | ||||
| #define	WHILE	317 | ||||
| #define	XOREQ	318 | ||||
| #define	EOI	319 | ||||
|  | ||||
| typedef unsigned int uint; | ||||
| typedef unsigned char uchar; | ||||
|  | ||||
| #define	BSIZE	8192 | ||||
|  | ||||
| #define	YYCTYPE		uchar | ||||
| #define	YYCURSOR	cursor | ||||
| #define	YYLIMIT		s->lim | ||||
| #define	YYMARKER	s->ptr | ||||
| #define	YYFILL(n)	{cursor = fill(s, cursor);} | ||||
|  | ||||
| #define	RET(i)	{s->cur = cursor; return i;} | ||||
|  | ||||
| typedef struct Scanner { | ||||
|     int			fd; | ||||
|     uchar		*bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof; | ||||
|     uint		line; | ||||
| } Scanner; | ||||
|  | ||||
| uchar *fill(Scanner *s, uchar *cursor){ | ||||
|     if(!s->eof){ | ||||
| 	uint cnt = s->tok - s->bot; | ||||
| 	if(cnt){ | ||||
| 	    memcpy(s->bot, s->tok, s->lim - s->tok); | ||||
| 	    s->tok = s->bot; | ||||
| 	    s->ptr -= cnt; | ||||
| 	    cursor -= cnt; | ||||
| 	    s->pos -= cnt; | ||||
| 	    s->lim -= cnt; | ||||
| 	} | ||||
| 	if((s->top - s->lim) < BSIZE){ | ||||
| 	    uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar)); | ||||
| 	    memcpy(buf, s->tok, s->lim - s->tok); | ||||
| 	    s->tok = buf; | ||||
| 	    s->ptr = &buf[s->ptr - s->bot]; | ||||
| 	    cursor = &buf[cursor - s->bot]; | ||||
| 	    s->pos = &buf[s->pos - s->bot]; | ||||
| 	    s->lim = &buf[s->lim - s->bot]; | ||||
| 	    s->top = &s->lim[BSIZE]; | ||||
| 	    free(s->bot); | ||||
| 	    s->bot = buf; | ||||
| 	} | ||||
| 	if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){ | ||||
| 	    s->eof = &s->lim[cnt]; *(s->eof)++ = '\n'; | ||||
| 	} | ||||
| 	s->lim += cnt; | ||||
|     } | ||||
|     return cursor; | ||||
| } | ||||
|  | ||||
| int scan(Scanner *s){ | ||||
| 	uchar *cursor = s->cur; | ||||
| std: | ||||
| 	s->tok = cursor; | ||||
| /*!re2c | ||||
| any	= [\000-\377]; | ||||
| O	= [0-7]; | ||||
| D	= [0-9]; | ||||
| L	= [a-zA-Z_]; | ||||
| H	= [a-fA-F0-9]; | ||||
| E	= [Ee] [+-]? D+; | ||||
| FS	= [fFlL]; | ||||
| IS	= [uUlL]*; | ||||
| ESC	= [\\] ([abfnrtv?'"\\] | "x" H+ | O+); | ||||
| */ | ||||
|  | ||||
| /*!re2c | ||||
| 	"/*"			{ goto comment; } | ||||
| 	 | ||||
| 	L (L|D)*		{ RET(ID); } | ||||
| 	 | ||||
| 	("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) | | ||||
| 	(['] (ESC|any\[\n\\'])* [']) | ||||
| 				{ RET(ICON); } | ||||
| 	 | ||||
| 	(D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?) | ||||
| 				{ RET(FCON); } | ||||
| 	 | ||||
| 	(["] (ESC|any\[\n\\"])* ["]) | ||||
| 				{ RET(SCON); } | ||||
| 	 | ||||
| 	"..."                   { RET(ELLIPSIS); } | ||||
| 	">>="			{ RET(RSHIFTEQ); } | ||||
| 	"<<="			{ RET(LSHIFTEQ); } | ||||
| 	"+="			{ RET(ADDEQ); } | ||||
| 	"-="			{ RET(SUBEQ); } | ||||
| 	"*="			{ RET(MULEQ); } | ||||
| 	"/="			{ RET(DIVEQ); } | ||||
| 	"%="			{ RET(MODEQ); } | ||||
| 	"&="			{ RET(ANDEQ); } | ||||
| 	"^="			{ RET(XOREQ); } | ||||
| 	"|="			{ RET(OREQ); } | ||||
| 	">>"			{ RET(RSHIFT); } | ||||
| 	"<<"			{ RET(LSHIFT); } | ||||
| 	"++"			{ RET(INCR); } | ||||
| 	"--"			{ RET(DECR); } | ||||
| 	"->"			{ RET(DEREF); } | ||||
| 	"&&"			{ RET(ANDAND); } | ||||
| 	"||"			{ RET(OROR); } | ||||
| 	"<="			{ RET(LEQ); } | ||||
| 	">="			{ RET(GEQ); } | ||||
| 	"=="			{ RET(EQL); } | ||||
| 	"!="			{ RET(NEQ); } | ||||
| 	";"			{ RET(';'); } | ||||
| 	"{"			{ RET('{'); } | ||||
| 	"}"			{ RET('}'); } | ||||
| 	","			{ RET(','); } | ||||
| 	":"			{ RET(':'); } | ||||
| 	"="			{ RET('='); } | ||||
| 	"("			{ RET('('); } | ||||
| 	")"			{ RET(')'); } | ||||
| 	"["			{ RET('['); } | ||||
| 	"]"			{ RET(']'); } | ||||
| 	"."			{ RET('.'); } | ||||
| 	"&"			{ RET('&'); } | ||||
| 	"!"			{ RET('!'); } | ||||
| 	"~"			{ RET('~'); } | ||||
| 	"-"			{ RET('-'); } | ||||
| 	"+"			{ RET('+'); } | ||||
| 	"*"			{ RET('*'); } | ||||
| 	"/"			{ RET('/'); } | ||||
| 	"%"			{ RET('%'); } | ||||
| 	"<"			{ RET('<'); } | ||||
| 	">"			{ RET('>'); } | ||||
| 	"^"			{ RET('^'); } | ||||
| 	"|"			{ RET('|'); } | ||||
| 	"?"			{ RET('?'); } | ||||
|  | ||||
|  | ||||
| 	[ \t\v\f]+		{ goto std; } | ||||
|  | ||||
| 	"\n" | ||||
| 	    { | ||||
| 		if(cursor == s->eof) RET(EOI); | ||||
| 		s->pos = cursor; s->line++; | ||||
| 		goto std; | ||||
| 	    } | ||||
|  | ||||
| 	any | ||||
| 	    { | ||||
| 		printf("unexpected character: %c\n", *s->tok); | ||||
| 		goto std; | ||||
| 	    } | ||||
| */ | ||||
|  | ||||
| comment: | ||||
| /*!re2c | ||||
| 	"*/"			{ goto std; } | ||||
| 	"\n" | ||||
| 	    { | ||||
| 		if(cursor == s->eof) RET(EOI); | ||||
| 		s->tok = s->pos = cursor; s->line++; | ||||
| 		goto comment; | ||||
| 	    } | ||||
|         any			{ goto comment; } | ||||
| */ | ||||
| } | ||||
|  | ||||
| main(){ | ||||
|     Scanner in; | ||||
|     int t; | ||||
|     memset((char*) &in, 0, sizeof(in)); | ||||
|     in.fd = 0; | ||||
|     while((t = scan(&in)) != EOI){ | ||||
| /* | ||||
| 	printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok); | ||||
| 	printf("%d\n", t); | ||||
| */ | ||||
|     } | ||||
|     close(in.fd); | ||||
| } | ||||
							
								
								
									
										63
									
								
								samples/C++/cvsignore.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								samples/C++/cvsignore.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
|  | ||||
| #define YYFILL(n) if (cursor >= limit) break; | ||||
| #define YYCTYPE char | ||||
| #define YYCURSOR cursor | ||||
| #define YYLIMIT limit | ||||
| #define YYMARKER marker | ||||
|  | ||||
| /*!re2c | ||||
| any     = (.|"\n"); | ||||
| value	= (":" (.\"$")+)?; | ||||
| cvsdat	= "Date"; | ||||
| cvsid	= "Id"; | ||||
| cvslog	= "Log"; | ||||
| cvsrev	= "Revision"; | ||||
| cvssrc	= "Source"; | ||||
| */ | ||||
|  | ||||
| #define APPEND(text) \ | ||||
| 	append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE)) | ||||
|  | ||||
| inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len) | ||||
| { | ||||
| 	memcpy(output + outsize, text, len); | ||||
| 	outsize += (len / sizeof(YYCTYPE)); | ||||
| } | ||||
|  | ||||
| void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged) | ||||
| { | ||||
| 	// rule | ||||
| 	// scan lines | ||||
| 	// find $ in lines | ||||
| 	//   compact $<keyword>: .. $ to $<keyword>$ | ||||
|    | ||||
| 	YYCTYPE *output; | ||||
| 	const YYCTYPE *cursor, *limit, *marker; | ||||
|  | ||||
| 	cursor = marker = output = *pText; | ||||
|  | ||||
| 	size_t insize = *pSize; | ||||
| 	size_t outsize = 0; | ||||
|  | ||||
| 	limit = cursor + insize; | ||||
|  | ||||
| 	while(1) { | ||||
| loop: | ||||
| /*!re2c | ||||
|  | ||||
| "$" cvsdat value "$"	{ APPEND(L"$" L"Date$"); goto loop; } | ||||
| "$" cvsid  value "$"	{ APPEND(L"$" L"Id$"); goto loop; } | ||||
| "$" cvslog value "$"	{ APPEND(L"$" L"Log$"); goto loop; } | ||||
| "$" cvsrev value "$"	{ APPEND(L"$" L"Revision$"); goto loop; } | ||||
| "$" cvssrc value "$"	{ APPEND(L"$" L"Source$"); goto loop; } | ||||
| any						{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; } | ||||
|  | ||||
| */ | ||||
| 	} | ||||
| 	output[outsize] = '\0'; | ||||
|  | ||||
| 	// set the new size | ||||
| 	*pSize = outsize; | ||||
| 	 | ||||
| 	*pbChanged = (insize == outsize) ? 0 : 1; | ||||
| } | ||||
							
								
								
									
										13
									
								
								samples/C++/simple.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/C++/simple.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #define	NULL		((char*) 0) | ||||
| char *scan(char *p){ | ||||
| char *q; | ||||
| #define	YYCTYPE		char | ||||
| #define	YYCURSOR	p | ||||
| #define	YYLIMIT		p | ||||
| #define	YYMARKER	q | ||||
| #define	YYFILL(n) | ||||
| /*!re2c | ||||
| 	[0-9]+		{return YYCURSOR;} | ||||
| 	[\000-\377]	{return NULL;} | ||||
| */ | ||||
| } | ||||
							
								
								
									
										9
									
								
								samples/Emacs Lisp/filenames/Cask
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Emacs Lisp/filenames/Cask
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| (package "composer" "0.0.7" "Interface to PHP Composer") | ||||
| (source "melpa" "https://melpa.org/packages/") | ||||
|  | ||||
| (package-file "composer.el") | ||||
|  | ||||
| (depends-on "f") | ||||
| (depends-on "s") | ||||
| (depends-on "request") | ||||
| (depends-on "seq") | ||||
							
								
								
									
										7
									
								
								samples/Erlang/filenames/Emakefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Erlang/filenames/Emakefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| {"src/*", [ | ||||
|    report,  | ||||
|    verbose,  | ||||
|    {i, "include"},  | ||||
|    {outdir, "ebin"}, | ||||
|    debug_info  | ||||
| ]}. | ||||
							
								
								
									
										12
									
								
								samples/Genie/Class.gs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/Genie/Class.gs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| init | ||||
| 	new Demo( "Demonstration class" ).run() | ||||
|  | ||||
| class Demo | ||||
| 	_message:string = "" | ||||
|  | ||||
| 	construct ( message:string = "Optional argument - no message passed in constructor" ) | ||||
| 		_message = message | ||||
|  | ||||
| 	def run() | ||||
| 		print( _message ) | ||||
| 		 | ||||
							
								
								
									
										2
									
								
								samples/Genie/Hello.gs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/Genie/Hello.gs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| init | ||||
| 	print( "Hello, World!" ) | ||||
							
								
								
									
										135
									
								
								samples/HCL/main.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								samples/HCL/main.tf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| resource "aws_security_group" "elb_sec_group" { | ||||
|   description = "Allow traffic from the internet to ELB port 80" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       from_port = 80 | ||||
|       to_port = 80 | ||||
|       protocol = "tcp" | ||||
|       cidr_blocks = ["${split(",", var.allowed_cidr_blocks)}"] | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_security_group" "dokku_allow_ssh_from_internal" { | ||||
|   description = "Allow git access over ssh from the private subnet" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       from_port = 22 | ||||
|       to_port = 22 | ||||
|       protocol = "tcp" | ||||
|       cidr_blocks = ["${var.private_subnet_cidr}"] | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_security_group" "allow_from_elb_to_instance" { | ||||
|   description = "Allow traffic from the ELB to the private instance" | ||||
|   vpc_id = "${var.vpc_id}" | ||||
|  | ||||
|   ingress { | ||||
|       security_groups = ["${aws_security_group.elb_sec_group.id}"] | ||||
|       from_port = 80 | ||||
|       to_port = 80 | ||||
|       protocol = "tcp" | ||||
|   } | ||||
|  | ||||
|   egress { | ||||
|       from_port = 0 | ||||
|       to_port = 0 | ||||
|       protocol = "-1" | ||||
|       cidr_blocks = ["0.0.0.0/0"] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_instance" "dokku" { | ||||
|   ami = "ami-47a23a30" | ||||
|   instance_type = "${var.instance_type}" | ||||
|   associate_public_ip_address = false | ||||
|   key_name = "${var.key_name}" | ||||
|   subnet_id = "${var.private_subnet_id}" | ||||
|   vpc_security_group_ids = [ | ||||
|     "${var.bastion_sec_group_id}", | ||||
|     "${aws_security_group.allow_from_elb_to_instance.id}", | ||||
|     "${aws_security_group.dokku_allow_ssh_from_internal.id}" | ||||
|   ] | ||||
|   tags { | ||||
|     Name = "${var.name}" | ||||
|   } | ||||
|   connection { | ||||
|     user = "ubuntu" | ||||
|     private_key = "${var.private_key}" | ||||
|     bastion_host = "${var.bastion_host}" | ||||
|     bastion_port = "${var.bastion_port}" | ||||
|     bastion_user = "${var.bastion_user}" | ||||
|     bastion_private_key = "${var.bastion_private_key}" | ||||
|   } | ||||
|   provisioner "file" { | ||||
|     source = "${path.module}/../scripts/install-dokku.sh" | ||||
|     destination = "/home/ubuntu/install-dokku.sh" | ||||
|   } | ||||
|   provisioner "remote-exec" { | ||||
|     inline = [ | ||||
|       "chmod +x /home/ubuntu/install-dokku.sh", | ||||
|       "HOSTNAME=${var.hostname} /home/ubuntu/install-dokku.sh" | ||||
|     ] | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_elb" "elb_dokku" { | ||||
|   name = "elb-dokku-${var.name}" | ||||
|   subnets = ["${var.public_subnet_id}"] | ||||
|   security_groups = ["${aws_security_group.elb_sec_group.id}"] | ||||
|  | ||||
|   listener { | ||||
|     instance_port = 80 | ||||
|     instance_protocol = "http" | ||||
|     lb_port = 80 | ||||
|     lb_protocol = "http" | ||||
|   } | ||||
|  | ||||
|   health_check { | ||||
|     healthy_threshold = 2 | ||||
|     unhealthy_threshold = 2 | ||||
|     timeout = 3 | ||||
|     target = "HTTP:80/" | ||||
|     interval = 30 | ||||
|   } | ||||
|  | ||||
|   instances = ["${aws_instance.dokku.id}"] | ||||
|   cross_zone_load_balancing = false | ||||
|   idle_timeout = 400 | ||||
|  | ||||
|   tags { | ||||
|     Name = "elb-dokku-${var.name}" | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "aws_route53_record" "dokku-deploy" { | ||||
|    zone_id = "${var.zone_id}" | ||||
|    name = "deploy.${var.hostname}" | ||||
|    type = "A" | ||||
|    ttl = "300" | ||||
|    records = ["${aws_instance.dokku.private_ip}"] | ||||
| } | ||||
|  | ||||
| resource "aws_route53_record" "dokku-wildcard" { | ||||
|    zone_id = "${var.zone_id}" | ||||
|    name = "*.${var.hostname}" | ||||
|    type = "CNAME" | ||||
|    ttl = "300" | ||||
|    records = ["${aws_elb.elb_dokku.dns_name}"] | ||||
| } | ||||
							
								
								
									
										923
									
								
								samples/JavaScript/ccalc-lex.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										923
									
								
								samples/JavaScript/ccalc-lex.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,923 @@ | ||||
| /* generated by jison-lex 0.3.4-159 */ | ||||
| var ccalcLex = (function () { | ||||
| // See also: | ||||
| // http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508 | ||||
| // but we keep the prototype.constructor and prototype.name assignment lines too for compatibility | ||||
| // with userland code which might access the derived class in a 'classic' way. | ||||
| function JisonLexerError(msg, hash) { | ||||
|     Object.defineProperty(this, 'name', { | ||||
|         enumerable: false, | ||||
|         writable: false, | ||||
|         value: 'JisonLexerError' | ||||
|     }); | ||||
|  | ||||
|     if (msg == null) msg = '???'; | ||||
|  | ||||
|     Object.defineProperty(this, 'message', { | ||||
|         enumerable: false, | ||||
|         writable: true, | ||||
|         value: msg | ||||
|     }); | ||||
|  | ||||
|     this.hash = hash; | ||||
|  | ||||
|     var stacktrace; | ||||
|     if (hash && hash.exception instanceof Error) { | ||||
|         var ex2 = hash.exception; | ||||
|         this.message = ex2.message || msg; | ||||
|         stacktrace = ex2.stack; | ||||
|     } | ||||
|     if (!stacktrace) { | ||||
|         if (Error.hasOwnProperty('captureStackTrace')) { // V8 | ||||
|             Error.captureStackTrace(this, this.constructor); | ||||
|         } else { | ||||
|             stacktrace = (new Error(msg)).stack; | ||||
|         } | ||||
|     } | ||||
|     if (stacktrace) { | ||||
|         Object.defineProperty(this, 'stack', { | ||||
|             enumerable: false, | ||||
|             writable: false, | ||||
|             value: stacktrace | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (typeof Object.setPrototypeOf === 'function') { | ||||
|     Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype); | ||||
| } else { | ||||
|     JisonLexerError.prototype = Object.create(Error.prototype); | ||||
| } | ||||
| JisonLexerError.prototype.constructor = JisonLexerError; | ||||
| JisonLexerError.prototype.name = 'JisonLexerError'; | ||||
|  | ||||
|  | ||||
| var lexer = { | ||||
|     EOF: 1, | ||||
|     ERROR: 2, | ||||
|  | ||||
|     // JisonLexerError: JisonLexerError,        // <-- injected by the code generator | ||||
|  | ||||
|     // options: {},                             // <-- injected by the code generator | ||||
|  | ||||
|     // yy: ...,                                 // <-- injected by setInput() | ||||
|  | ||||
|     __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state | ||||
|  | ||||
|     __error_infos: [],                          // INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup | ||||
|  | ||||
|     __decompressed: false,                      // INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use | ||||
|  | ||||
|     done: false,                                // INTERNAL USE ONLY | ||||
|     _backtrack: false,                          // INTERNAL USE ONLY | ||||
|     _input: '',                                 // INTERNAL USE ONLY | ||||
|     _more: false,                               // INTERNAL USE ONLY | ||||
|     _signaled_error_token: false,               // INTERNAL USE ONLY | ||||
|  | ||||
|     conditionStack: [],                         // INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()` | ||||
|  | ||||
|     match: '',                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely! | ||||
|     matched: '',                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far | ||||
|     matches: false,                             // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt | ||||
|     yytext: '',                                 // ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API. | ||||
|     offset: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far | ||||
|     yyleng: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`) | ||||
|     yylineno: 0,                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located | ||||
|     yylloc: null,                               // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction | ||||
|  | ||||
|     // INTERNAL USE: construct a suitable error info hash object instance for `parseError`. | ||||
|     constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable) { | ||||
|         var pei = { | ||||
|             errStr: msg, | ||||
|             recoverable: !!recoverable, | ||||
|             text: this.match,           // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'... | ||||
|             token: null, | ||||
|             line: this.yylineno, | ||||
|             loc: this.yylloc, | ||||
|             yy: this.yy, | ||||
|             lexer: this, | ||||
|  | ||||
|             // and make sure the error info doesn't stay due to potential | ||||
|             // ref cycle via userland code manipulations. | ||||
|             // These would otherwise all be memory leak opportunities! | ||||
|             // | ||||
|             // Note that only array and object references are nuked as those | ||||
|             // constitute the set of elements which can produce a cyclic ref. | ||||
|             // The rest of the members is kept intact as they are harmless. | ||||
|             destroy: function destructLexErrorInfo() { | ||||
|                 // remove cyclic references added to error info: | ||||
|                 // info.yy = null; | ||||
|                 // info.lexer = null; | ||||
|                 // ... | ||||
|                 var rec = !!this.recoverable; | ||||
|                 for (var key in this) { | ||||
|                     if (this.hasOwnProperty(key) && typeof key === 'object') { | ||||
|                         this[key] = undefined; | ||||
|                     } | ||||
|                 } | ||||
|                 this.recoverable = rec; | ||||
|             } | ||||
|         }; | ||||
|         // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection! | ||||
|         this.__error_infos.push(pei); | ||||
|         return pei; | ||||
|     }, | ||||
|  | ||||
|     parseError: function lexer_parseError(str, hash) { | ||||
|         if (this.yy.parser && typeof this.yy.parser.parseError === 'function') { | ||||
|             return this.yy.parser.parseError(str, hash) || this.ERROR; | ||||
|         } else if (typeof this.yy.parseError === 'function') { | ||||
|             return this.yy.parseError.call(this, str, hash) || this.ERROR; | ||||
|         } else { | ||||
|             throw new this.JisonLexerError(str); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     // final cleanup function for when we have completed lexing the input;  | ||||
|     // make it an API so that external code can use this one once userland | ||||
|     // code has decided it's time to destroy any lingering lexer error | ||||
|     // hash object instances and the like: this function helps to clean | ||||
|     // up these constructs, which *may* carry cyclic references which would | ||||
|     // otherwise prevent the instances from being properly and timely | ||||
|     // garbage-collected, i.e. this function helps prevent memory leaks! | ||||
|     cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) { | ||||
|         var rv; | ||||
|  | ||||
|         // prevent lingering circular references from causing memory leaks: | ||||
|         this.setInput('', {}); | ||||
|  | ||||
|         // nuke the error hash info instances created during this run. | ||||
|         // Userland code must COPY any data/references | ||||
|         // in the error hash instance(s) it is more permanently interested in. | ||||
|         if (!do_not_nuke_errorinfos) { | ||||
|             for (var i = this.__error_infos.length - 1; i >= 0; i--) { | ||||
|                 var el = this.__error_infos[i]; | ||||
|                 if (el && typeof el.destroy === 'function') { | ||||
|                     el.destroy(); | ||||
|                 } | ||||
|             } | ||||
|             this.__error_infos.length = 0; | ||||
|         } | ||||
|  | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // clear the lexer token context; intended for internal use only | ||||
|     clear: function lexer_clear() { | ||||
|         this.yytext = ''; | ||||
|         this.yyleng = 0; | ||||
|         this.match = ''; | ||||
|         this.matches = false; | ||||
|         this._more = false; | ||||
|         this._backtrack = false; | ||||
|     }, | ||||
|  | ||||
|     // resets the lexer, sets new input | ||||
|     setInput: function lexer_setInput(input, yy) { | ||||
|         this.yy = yy || this.yy || {}; | ||||
|  | ||||
|         // also check if we've fully initialized the lexer instance, | ||||
|         // including expansion work to be done to go from a loaded | ||||
|         // lexer to a usable lexer: | ||||
|         if (!this.__decompressed) { | ||||
|           // step 1: decompress the regex list: | ||||
|           var rules = this.rules; | ||||
|           for (var i = 0, len = rules.length; i < len; i++) { | ||||
|             var rule_re = rules[i]; | ||||
|  | ||||
|             // compression: is the RE an xref to another RE slot in the rules[] table? | ||||
|             if (typeof rule_re === 'number') { | ||||
|               rules[i] = rules[rule_re]; | ||||
|             } | ||||
|           } | ||||
|  | ||||
|           // step 2: unfold the conditions[] set to make these ready for use: | ||||
|           var conditions = this.conditions; | ||||
|           for (var k in conditions) { | ||||
|             var spec = conditions[k]; | ||||
|  | ||||
|             var rule_ids = spec.rules; | ||||
|  | ||||
|             var len = rule_ids.length; | ||||
|             var rule_regexes = new Array(len + 1);            // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple! | ||||
|             var rule_new_ids = new Array(len + 1); | ||||
|  | ||||
|             if (this.rules_prefix1) { | ||||
|                 var rule_prefixes = new Array(65536); | ||||
|                 var first_catch_all_index = 0; | ||||
|  | ||||
|                 for (var i = 0; i < len; i++) { | ||||
|                   var idx = rule_ids[i]; | ||||
|                   var rule_re = rules[idx]; | ||||
|                   rule_regexes[i + 1] = rule_re; | ||||
|                   rule_new_ids[i + 1] = idx; | ||||
|  | ||||
|                   var prefix = this.rules_prefix1[idx]; | ||||
|                   // compression: is the PREFIX-STRING an xref to another PREFIX-STRING slot in the rules_prefix1[] table? | ||||
|                   if (typeof prefix === 'number') { | ||||
|                     prefix = this.rules_prefix1[prefix]; | ||||
|                   } | ||||
|                   // init the prefix lookup table: first come, first serve... | ||||
|                   if (!prefix) { | ||||
|                     if (!first_catch_all_index) { | ||||
|                       first_catch_all_index = i + 1; | ||||
|                     } | ||||
|                   } else { | ||||
|                     for (var j = 0, pfxlen = prefix.length; j < pfxlen; j++) { | ||||
|                       var pfxch = prefix.charCodeAt(j); | ||||
|                       // first come, first serve: | ||||
|                       if (!rule_prefixes[pfxch]) { | ||||
|                         rule_prefixes[pfxch] = i + 1; | ||||
|                       }   | ||||
|                     } | ||||
|                   } | ||||
|                 } | ||||
|  | ||||
|                 // if no catch-all prefix has been encountered yet, it means all | ||||
|                 // rules have limited prefix sets and it MAY be that particular | ||||
|                 // input characters won't be recognized by any rule in this  | ||||
|                 // condition state. | ||||
|                 //  | ||||
|                 // To speed up their discovery at run-time while keeping the | ||||
|                 // remainder of the lexer kernel code very simple (and fast), | ||||
|                 // we point these to an 'illegal' rule set index *beyond* | ||||
|                 // the end of the rule set. | ||||
|                 if (!first_catch_all_index) { | ||||
|                   first_catch_all_index = len + 1; | ||||
|                 } | ||||
|  | ||||
|                 for (var i = 0; i < 65536; i++) { | ||||
|                   if (!rule_prefixes[i]) { | ||||
|                     rule_prefixes[i] = first_catch_all_index;  | ||||
|                   } | ||||
|                 } | ||||
|  | ||||
|                 spec.__dispatch_lut = rule_prefixes; | ||||
|             } else { | ||||
|                 for (var i = 0; i < len; i++) { | ||||
|                   var idx = rule_ids[i]; | ||||
|                   var rule_re = rules[idx]; | ||||
|                   rule_regexes[i + 1] = rule_re; | ||||
|                   rule_new_ids[i + 1] = idx; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             spec.rules = rule_new_ids; | ||||
|             spec.__rule_regexes = rule_regexes; | ||||
|             spec.__rule_count = len; | ||||
|           } | ||||
|  | ||||
|           this.__decompressed = true; | ||||
|         } | ||||
|  | ||||
|         this._input = input || ''; | ||||
|         this.clear(); | ||||
|         this._signaled_error_token = false; | ||||
|         this.done = false; | ||||
|         this.yylineno = 0; | ||||
|         this.matched = ''; | ||||
|         this.conditionStack = ['INITIAL']; | ||||
|         this.__currentRuleSet__ = null; | ||||
|         this.yylloc = { | ||||
|             first_line: 1, | ||||
|             first_column: 0, | ||||
|             last_line: 1, | ||||
|             last_column: 0 | ||||
|         }; | ||||
|         if (this.options.ranges) { | ||||
|             this.yylloc.range = [0, 0]; | ||||
|         } | ||||
|         this.offset = 0; | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // consumes and returns one char from the input | ||||
|     input: function lexer_input() { | ||||
|         if (!this._input) { | ||||
|             this.done = true; | ||||
|             return null; | ||||
|         } | ||||
|         var ch = this._input[0]; | ||||
|         this.yytext += ch; | ||||
|         this.yyleng++; | ||||
|         this.offset++; | ||||
|         this.match += ch; | ||||
|         this.matched += ch; | ||||
|         // Count the linenumber up when we hit the LF (or a stand-alone CR). | ||||
|         // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo | ||||
|         // and we advance immediately past the LF as well, returning both together as if | ||||
|         // it was all a single 'character' only. | ||||
|         var slice_len = 1; | ||||
|         var lines = false; | ||||
|         if (ch === '\n') { | ||||
|             lines = true; | ||||
|         } else if (ch === '\r') { | ||||
|             lines = true; | ||||
|             var ch2 = this._input[1]; | ||||
|             if (ch2 === '\n') { | ||||
|                 slice_len++; | ||||
|                 ch += ch2; | ||||
|                 this.yytext += ch2; | ||||
|                 this.yyleng++; | ||||
|                 this.offset++; | ||||
|                 this.match += ch2; | ||||
|                 this.matched += ch2; | ||||
|                 if (this.options.ranges) { | ||||
|                     this.yylloc.range[1]++; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (lines) { | ||||
|             this.yylineno++; | ||||
|             this.yylloc.last_line++; | ||||
|         } else { | ||||
|             this.yylloc.last_column++; | ||||
|         } | ||||
|         if (this.options.ranges) { | ||||
|             this.yylloc.range[1]++; | ||||
|         } | ||||
|  | ||||
|         this._input = this._input.slice(slice_len); | ||||
|         return ch; | ||||
|     }, | ||||
|  | ||||
|     // unshifts one char (or a string) into the input | ||||
|     unput: function lexer_unput(ch) { | ||||
|         var len = ch.length; | ||||
|         var lines = ch.split(/(?:\r\n?|\n)/g); | ||||
|  | ||||
|         this._input = ch + this._input; | ||||
|         this.yytext = this.yytext.substr(0, this.yytext.length - len); | ||||
|         //this.yyleng -= len; | ||||
|         this.offset -= len; | ||||
|         var oldLines = this.match.split(/(?:\r\n?|\n)/g); | ||||
|         this.match = this.match.substr(0, this.match.length - len); | ||||
|         this.matched = this.matched.substr(0, this.matched.length - len); | ||||
|  | ||||
|         if (lines.length - 1) { | ||||
|             this.yylineno -= lines.length - 1; | ||||
|         } | ||||
|  | ||||
|         this.yylloc.last_line = this.yylineno + 1; | ||||
|         this.yylloc.last_column = (lines ? | ||||
|                 (lines.length === oldLines.length ? this.yylloc.first_column : 0) | ||||
|                 + oldLines[oldLines.length - lines.length].length - lines[0].length : | ||||
|                 this.yylloc.first_column - len); | ||||
|  | ||||
|         if (this.options.ranges) { | ||||
|             this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len; | ||||
|         } | ||||
|         this.yyleng = this.yytext.length; | ||||
|         this.done = false; | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // When called from action, caches matched text and appends it on next action | ||||
|     more: function lexer_more() { | ||||
|         this._more = true; | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. | ||||
|     reject: function lexer_reject() { | ||||
|         if (this.options.backtrack_lexer) { | ||||
|             this._backtrack = true; | ||||
|         } else { | ||||
|             // when the parseError() call returns, we MUST ensure that the error is registered. | ||||
|             // We accomplish this by signaling an 'error' token to be produced for the current | ||||
|             // .lex() run. | ||||
|             var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), false); | ||||
|             this._signaled_error_token = (this.parseError(p.errStr, p) || this.ERROR); | ||||
|         } | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // retain first n characters of the match | ||||
|     less: function lexer_less(n) { | ||||
|         return this.unput(this.match.slice(n)); | ||||
|     }, | ||||
|  | ||||
|     // return (part of the) already matched input, i.e. for error messages. | ||||
|     // Limit the returned string length to `maxSize` (default: 20). | ||||
|     // Limit the returned string to the `maxLines` number of lines of input (default: 1). | ||||
|     // Negative limit values equal *unlimited*. | ||||
|     pastInput: function lexer_pastInput(maxSize, maxLines) { | ||||
|         var past = this.matched.substring(0, this.matched.length - this.match.length); | ||||
|         if (maxSize < 0) | ||||
|             maxSize = past.length; | ||||
|         else if (!maxSize) | ||||
|             maxSize = 20; | ||||
|         if (maxLines < 0) | ||||
|             maxLines = past.length;         // can't ever have more input lines than this! | ||||
|         else if (!maxLines) | ||||
|             maxLines = 1; | ||||
|         // `substr` anticipation: treat \r\n as a single character and take a little | ||||
|         // more than necessary so that we can still properly check against maxSize | ||||
|         // after we've transformed and limited the newLines in here: | ||||
|         past = past.substr(-maxSize * 2 - 2); | ||||
|         // now that we have a significantly reduced string to process, transform the newlines | ||||
|         // and chop them, then limit them: | ||||
|         var a = past.replace(/\r\n|\r/g, '\n').split('\n'); | ||||
|         a = a.slice(-maxLines); | ||||
|         past = a.join('\n'); | ||||
|         // When, after limiting to maxLines, we still have too much to return,  | ||||
|         // do add an ellipsis prefix... | ||||
|         if (past.length > maxSize) { | ||||
|             past = '...' + past.substr(-maxSize); | ||||
|         } | ||||
|         return past; | ||||
|     }, | ||||
|  | ||||
|     // return (part of the) upcoming input, i.e. for error messages. | ||||
|     // Limit the returned string length to `maxSize` (default: 20). | ||||
|     // Limit the returned string to the `maxLines` number of lines of input (default: 1). | ||||
|     // Negative limit values equal *unlimited*. | ||||
|     upcomingInput: function lexer_upcomingInput(maxSize, maxLines) { | ||||
|         var next = this.match; | ||||
|         if (maxSize < 0) | ||||
|             maxSize = next.length + this._input.length; | ||||
|         else if (!maxSize) | ||||
|             maxSize = 20; | ||||
|         if (maxLines < 0) | ||||
|             maxLines = maxSize;         // can't ever have more input lines than this! | ||||
|         else if (!maxLines) | ||||
|             maxLines = 1; | ||||
|         // `substring` anticipation: treat \r\n as a single character and take a little | ||||
|         // more than necessary so that we can still properly check against maxSize | ||||
|         // after we've transformed and limited the newLines in here: | ||||
|         if (next.length < maxSize * 2 + 2) { | ||||
|             next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8 | ||||
|         } | ||||
|         // now that we have a significantly reduced string to process, transform the newlines | ||||
|         // and chop them, then limit them: | ||||
|         var a = next.replace(/\r\n|\r/g, '\n').split('\n'); | ||||
|         a = a.slice(0, maxLines); | ||||
|         next = a.join('\n'); | ||||
|         // When, after limiting to maxLines, we still have too much to return,  | ||||
|         // do add an ellipsis postfix... | ||||
|         if (next.length > maxSize) { | ||||
|             next = next.substring(0, maxSize) + '...'; | ||||
|         } | ||||
|         return next; | ||||
|     }, | ||||
|  | ||||
|     // return a string which displays the character position where the lexing error occurred, i.e. for error messages | ||||
|     showPosition: function lexer_showPosition(maxPrefix, maxPostfix) { | ||||
|         var pre = this.pastInput(maxPrefix).replace(/\s/g, ' '); | ||||
|         var c = new Array(pre.length + 1).join('-'); | ||||
|         return pre + this.upcomingInput(maxPostfix).replace(/\s/g, ' ') + '\n' + c + '^'; | ||||
|     }, | ||||
|  | ||||
|     // helper function, used to produce a human readable description as a string, given | ||||
|     // the input `yylloc` location object.  | ||||
|     // Set `display_range_too` to TRUE to include the string character index position(s) | ||||
|     // in the description if the `yylloc.range` is available.  | ||||
|     describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) { | ||||
|         var l1 = yylloc.first_line; | ||||
|         var l2 = yylloc.last_line; | ||||
|         var o1 = yylloc.first_column; | ||||
|         var o2 = yylloc.last_column - 1; | ||||
|         var dl = l2 - l1; | ||||
|         var d_o = (dl === 0 ? o2 - o1 : 1000); | ||||
|         var rv; | ||||
|         if (dl === 0) { | ||||
|             rv = 'line ' + l1 + ', '; | ||||
|             if (d_o === 0) { | ||||
|                 rv += 'column ' + o1; | ||||
|             } else { | ||||
|                 rv += 'columns ' + o1 + ' .. ' + o2; | ||||
|             } | ||||
|         } else { | ||||
|             rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')'; | ||||
|         } | ||||
|         if (yylloc.range && display_range_too) { | ||||
|             var r1 = yylloc.range[0]; | ||||
|             var r2 = yylloc.range[1] - 1; | ||||
|             if (r2 === r1) { | ||||
|                 rv += ' {String Offset: ' + r1 + '}'; | ||||
|             } else { | ||||
|                 rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}'; | ||||
|             } | ||||
|         } | ||||
|         return rv; | ||||
|         // return JSON.stringify(yylloc); | ||||
|     }, | ||||
|  | ||||
|     // test the lexed token: return FALSE when not a match, otherwise return token. | ||||
|     // | ||||
|     // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]` | ||||
|     // contains the actually matched text string. | ||||
|     // | ||||
|     // Also move the input cursor forward and update the match collectors: | ||||
|     // - yytext | ||||
|     // - yyleng | ||||
|     // - match | ||||
|     // - matches | ||||
|     // - yylloc | ||||
|     // - offset | ||||
|     test_match: function lexer_test_match(match, indexed_rule) { | ||||
|         var token, | ||||
|             lines, | ||||
|             backup, | ||||
|             match_str; | ||||
|  | ||||
|         if (this.options.backtrack_lexer) { | ||||
|             // save context | ||||
|             backup = { | ||||
|                 yylineno: this.yylineno, | ||||
|                 yylloc: { | ||||
|                     first_line: this.yylloc.first_line, | ||||
|                     last_line: this.last_line, | ||||
|                     first_column: this.yylloc.first_column, | ||||
|                     last_column: this.yylloc.last_column | ||||
|                 }, | ||||
|                 yytext: this.yytext, | ||||
|                 match: this.match, | ||||
|                 matches: this.matches, | ||||
|                 matched: this.matched, | ||||
|                 yyleng: this.yyleng, | ||||
|                 offset: this.offset, | ||||
|                 _more: this._more, | ||||
|                 _input: this._input, | ||||
|                 yy: this.yy, | ||||
|                 conditionStack: this.conditionStack.slice(0), | ||||
|                 done: this.done | ||||
|             }; | ||||
|             if (this.options.ranges) { | ||||
|                 backup.yylloc.range = this.yylloc.range.slice(0); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         match_str = match[0]; | ||||
|         lines = match_str.match(/(?:\r\n?|\n).*/g); | ||||
|         if (lines) { | ||||
|             this.yylineno += lines.length; | ||||
|         } | ||||
|         this.yylloc = { | ||||
|             first_line: this.yylloc.last_line, | ||||
|             last_line: this.yylineno + 1, | ||||
|             first_column: this.yylloc.last_column, | ||||
|             last_column: lines ? | ||||
|                          lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : | ||||
|                          this.yylloc.last_column + match_str.length | ||||
|         }; | ||||
|         this.yytext += match_str; | ||||
|         this.match += match_str; | ||||
|         this.matches = match; | ||||
|         this.yyleng = this.yytext.length; | ||||
|         if (this.options.ranges) { | ||||
|             this.yylloc.range = [this.offset, this.offset + this.yyleng]; | ||||
|         } | ||||
|         // previous lex rules MAY have invoked the `more()` API rather than producing a token: | ||||
|         // those rules will already have moved this `offset` forward matching their match lengths, | ||||
|         // hence we must only add our own match length now: | ||||
|         this.offset += match_str.length; | ||||
|         this._more = false; | ||||
|         this._backtrack = false; | ||||
|         this._input = this._input.slice(match_str.length); | ||||
|         this.matched += match_str; | ||||
|  | ||||
|         // calling this method:  | ||||
|         // | ||||
|         //   function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {...} | ||||
|         token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */); | ||||
|         // otherwise, when the action codes are all simple return token statements: | ||||
|         //token = this.simpleCaseActionClusters[indexed_rule]; | ||||
|  | ||||
|         if (this.done && this._input) { | ||||
|             this.done = false; | ||||
|         } | ||||
|         if (token) { | ||||
|             return token; | ||||
|         } else if (this._backtrack) { | ||||
|             // recover context | ||||
|             for (var k in backup) { | ||||
|                 this[k] = backup[k]; | ||||
|             } | ||||
|             this.__currentRuleSet__ = null; | ||||
|             return false; // rule action called reject() implying the next rule should be tested instead. | ||||
|         } else if (this._signaled_error_token) { | ||||
|             // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception! | ||||
|             token = this._signaled_error_token; | ||||
|             this._signaled_error_token = false; | ||||
|             return token; | ||||
|         } | ||||
|         return false; | ||||
|     }, | ||||
|  | ||||
|     // return next match in input | ||||
|     next: function lexer_next() { | ||||
|         if (this.done) { | ||||
|             this.clear(); | ||||
|             return this.EOF; | ||||
|         } | ||||
|         if (!this._input) { | ||||
|             this.done = true; | ||||
|         } | ||||
|  | ||||
|         var token, | ||||
|             match, | ||||
|             tempMatch, | ||||
|             index; | ||||
|         if (!this._more) { | ||||
|             this.clear(); | ||||
|         } | ||||
|         var spec = this.__currentRuleSet__; | ||||
|         if (!spec) { | ||||
|             // Update the ruleset cache as we apparently encountered a state change or just started lexing. | ||||
|             // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will | ||||
|             // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps | ||||
|             // speed up those activities a tiny bit. | ||||
|             spec = this.__currentRuleSet__ = this._currentRules(); | ||||
|         } | ||||
|  | ||||
|         var rule_ids = spec.rules; | ||||
| //        var dispatch = spec.__dispatch_lut; | ||||
|         var regexes = spec.__rule_regexes; | ||||
|         var len = spec.__rule_count; | ||||
|  | ||||
| //        var c0 = this._input[0]; | ||||
|  | ||||
|         // Note: the arrays are 1-based, while `len` itself is a valid index,  | ||||
|         // hence the non-standard less-or-equal check in the next loop condition! | ||||
|         //  | ||||
|         // `dispatch` is a lookup table which lists the *first* rule which matches the 1-char *prefix* of the rule-to-match. | ||||
|         // By using that array as a jumpstart, we can cut down on the otherwise O(n*m) behaviour of this lexer, down to | ||||
|         // O(n) ideally, where: | ||||
|         //  | ||||
|         // - N is the number of input particles -- which is not precisely characters  | ||||
|         //   as we progress on a per-regex-match basis rather than on a per-character basis | ||||
|         //    | ||||
|         // - M is the number of rules (regexes) to test in the active condition state. | ||||
|         //   | ||||
|         for (var i = 1 /* (dispatch[c0] || 1) */ ; i <= len; i++) { | ||||
|             tempMatch = this._input.match(regexes[i]); | ||||
|             if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { | ||||
|                 match = tempMatch; | ||||
|                 index = i; | ||||
|                 if (this.options.backtrack_lexer) { | ||||
|                     token = this.test_match(tempMatch, rule_ids[i]); | ||||
|                     if (token !== false) { | ||||
|                         return token; | ||||
|                     } else if (this._backtrack) { | ||||
|                         match = undefined; | ||||
|                         continue; // rule action called reject() implying a rule MISmatch. | ||||
|                     } else { | ||||
|                         // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) | ||||
|                         return false; | ||||
|                     } | ||||
|                 } else if (!this.options.flex) { | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if (match) { | ||||
|             token = this.test_match(match, rule_ids[index]); | ||||
|             if (token !== false) { | ||||
|                 return token; | ||||
|             } | ||||
|             // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) | ||||
|             return false; | ||||
|         } | ||||
|         if (this._input === '') { | ||||
|             this.done = true; | ||||
|             return this.EOF; | ||||
|         } else { | ||||
|             var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), this.options.lexer_errors_are_recoverable); | ||||
|             token = (this.parseError(p.errStr, p) || this.ERROR); | ||||
|             if (token === this.ERROR) { | ||||
|                 // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time: | ||||
|                 if (!this.match.length) { | ||||
|                     this.input(); | ||||
|                 } | ||||
|             } | ||||
|             return token; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     // return next match that has a token | ||||
|     lex: function lexer_lex() { | ||||
|         var r; | ||||
|         // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer: | ||||
|         if (typeof this.options.pre_lex === 'function') { | ||||
|             r = this.options.pre_lex.call(this); | ||||
|         } | ||||
|         while (!r) { | ||||
|             r = this.next(); | ||||
|         } | ||||
|         if (typeof this.options.post_lex === 'function') { | ||||
|             // (also account for a userdef function which does not return any value: keep the token as is) | ||||
|             r = this.options.post_lex.call(this, r) || r; | ||||
|         } | ||||
|         return r; | ||||
|     }, | ||||
|  | ||||
|     // backwards compatible alias for `pushState()`; | ||||
|     // the latter is symmetrical with `popState()` and we advise to use | ||||
|     // those APIs in any modern lexer code, rather than `begin()`. | ||||
|     begin: function lexer_begin(condition) { | ||||
|         return this.pushState(condition); | ||||
|     }, | ||||
|  | ||||
|     // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) | ||||
|     pushState: function lexer_pushState(condition) { | ||||
|         this.conditionStack.push(condition); | ||||
|         this.__currentRuleSet__ = null; | ||||
|         return this; | ||||
|     }, | ||||
|  | ||||
|     // pop the previously active lexer condition state off the condition stack | ||||
|     popState: function lexer_popState() { | ||||
|         var n = this.conditionStack.length - 1; | ||||
|         if (n > 0) { | ||||
|             this.__currentRuleSet__ = null; | ||||
|             return this.conditionStack.pop(); | ||||
|         } else { | ||||
|             return this.conditionStack[0]; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available | ||||
|     topState: function lexer_topState(n) { | ||||
|         n = this.conditionStack.length - 1 - Math.abs(n || 0); | ||||
|         if (n >= 0) { | ||||
|             return this.conditionStack[n]; | ||||
|         } else { | ||||
|             return 'INITIAL'; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     // (internal) determine the lexer rule set which is active for the currently active lexer condition state | ||||
|     _currentRules: function lexer__currentRules() { | ||||
|         if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { | ||||
|             return this.conditions[this.conditionStack[this.conditionStack.length - 1]]; | ||||
|         } else { | ||||
|             return this.conditions['INITIAL']; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     // return the number of states currently on the stack | ||||
|     stateStackSize: function lexer_stateStackSize() { | ||||
|         return this.conditionStack.length; | ||||
|     }, | ||||
| options: {}, | ||||
| JisonLexerError: JisonLexerError, | ||||
| performAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) { | ||||
|  | ||||
| var YYSTATE = YY_START; | ||||
| switch($avoiding_name_collisions) { | ||||
| case 0 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       [ \t\r\n]+ */  | ||||
|   | ||||
|     /* eat up whitespace */ | ||||
|     BeginToken(yy_.yytext);  | ||||
|       | ||||
| break; | ||||
| case 1 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       {DIGIT}+ */  | ||||
|   | ||||
|     BeginToken(yy_.yytext);  | ||||
|     yylval.value = atof(yy_.yytext); | ||||
|     return VALUE; | ||||
|       | ||||
| break; | ||||
| case 2 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       {DIGIT}+\.{DIGIT}* */  | ||||
|   | ||||
|     BeginToken(yy_.yytext); | ||||
|     yylval.value = atof(yy_.yytext); | ||||
|     return VALUE; | ||||
|       | ||||
| break; | ||||
| case 3 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       {DIGIT}+[eE]["+""-"]?{DIGIT}* */  | ||||
|   | ||||
|     BeginToken(yy_.yytext); | ||||
|     yylval.value = atof(yy_.yytext); | ||||
|     return VALUE; | ||||
|       | ||||
| break; | ||||
| case 4 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       {DIGIT}+\.{DIGIT}*[eE]["+""-"]?{DIGIT}* */  | ||||
|   | ||||
|     BeginToken(yy_.yytext); | ||||
|     yylval.value = atof(yy_.yytext); | ||||
|     return VALUE; | ||||
|       | ||||
| break; | ||||
| case 5 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       {ID} */  | ||||
|   | ||||
|     BeginToken(yy_.yytext); | ||||
|     yylval.string = malloc(strlen(yy_.yytext)+1); | ||||
|     strcpy(yylval.string, yy_.yytext); | ||||
|     return IDENTIFIER; | ||||
|       | ||||
| break; | ||||
| case 6 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       \+ */  | ||||
|   BeginToken(yy_.yytext); return ADD;   | ||||
| break; | ||||
| case 7 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       - */  | ||||
|   BeginToken(yy_.yytext); return SUB;   | ||||
| break; | ||||
| case 8 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       \* */  | ||||
|   BeginToken(yy_.yytext); return MULT;   | ||||
| break; | ||||
| case 9 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       \/ */  | ||||
|   BeginToken(yy_.yytext); return DIV;   | ||||
| break; | ||||
| case 10 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       \( */  | ||||
|   BeginToken(yy_.yytext); return LBRACE;   | ||||
| break; | ||||
| case 11 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       \) */  | ||||
|   BeginToken(yy_.yytext); return RBRACE;   | ||||
| break; | ||||
| case 12 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       ; */  | ||||
|   BeginToken(yy_.yytext); return SEMICOLON;   | ||||
| break; | ||||
| case 13 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       = */  | ||||
|   BeginToken(yy_.yytext); return ASSIGN;   | ||||
| break; | ||||
| case 14 :  | ||||
| /*! Conditions:: INITIAL */  | ||||
| /*! Rule::       . */  | ||||
|   | ||||
|     BeginToken(yy_.yytext); | ||||
|     return yy_.yytext[0]; | ||||
|       | ||||
| break; | ||||
| default: | ||||
|   return this.simpleCaseActionClusters[$avoiding_name_collisions]; | ||||
| } | ||||
| }, | ||||
| simpleCaseActionClusters: { | ||||
|  | ||||
| }, | ||||
| rules: [ | ||||
| /^(?:[ \t\r\n]+)/, | ||||
| /^(?:(\d)+)/, | ||||
| /^(?:(\d)+\.(\d)*)/, | ||||
| /^(?:(\d)+[Ee]["+]?(\d)*)/, | ||||
| /^(?:(\d)+\.(\d)*[Ee]["+]?(\d)*)/, | ||||
| /^(?:([^\W\d]\w*))/, | ||||
| /^(?:\+)/, | ||||
| /^(?:-)/, | ||||
| /^(?:\*)/, | ||||
| /^(?:\/)/, | ||||
| /^(?:\()/, | ||||
| /^(?:\))/, | ||||
| /^(?:;)/, | ||||
| /^(?:=)/, | ||||
| /^(?:.)/ | ||||
| ], | ||||
| conditions: { | ||||
|   "INITIAL": { | ||||
|     rules: [ | ||||
|       0, | ||||
|       1, | ||||
|       2, | ||||
|       3, | ||||
|       4, | ||||
|       5, | ||||
|       6, | ||||
|       7, | ||||
|       8, | ||||
|       9, | ||||
|       10, | ||||
|       11, | ||||
|       12, | ||||
|       13, | ||||
|       14 | ||||
|     ], | ||||
|     inclusive: true | ||||
|   } | ||||
| } | ||||
| }; | ||||
|  | ||||
| /*-------------------------------------------------------------------- | ||||
|  * lex.l | ||||
|  *------------------------------------------------------------------*/; | ||||
| return lexer; | ||||
| })(); | ||||
							
								
								
									
										2145
									
								
								samples/JavaScript/ccalc-parse.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2145
									
								
								samples/JavaScript/ccalc-parse.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										31
									
								
								samples/JavaScript/proto.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/JavaScript/proto.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /** | ||||
|  * @fileoverview | ||||
|  * @enhanceable | ||||
|  * @public | ||||
|  */ | ||||
| // GENERATED CODE -- DO NOT EDIT! | ||||
|  | ||||
| goog.provide('proto.google.protobuf.Timestamp'); | ||||
|  | ||||
| goog.require('jspb.Message'); | ||||
|  | ||||
| /** | ||||
|  * Generated by JsPbCodeGenerator. | ||||
|  * @param {Array=} opt_data Optional initial data array, typically from a | ||||
|  * server response, or constructed directly in Javascript. The array is used | ||||
|  * in place and becomes part of the constructed object. It is not cloned. | ||||
|  * If no data is provided, the constructed object will be empty, but still | ||||
|  * valid. | ||||
|  * @extends {jspb.Message} | ||||
|  * @constructor | ||||
|  */ | ||||
| proto.google.protobuf.Timestamp = function(opt_data) { | ||||
|   jspb.Message.initialize(this, opt_data, 0, -1, null, null); | ||||
| }; | ||||
| goog.inherits(proto.google.protobuf.Timestamp, jspb.Message); | ||||
| if (goog.DEBUG && !COMPILED) { | ||||
|   proto.google.protobuf.Timestamp.displayName = 'proto.google.protobuf.Timestamp'; | ||||
| } | ||||
|  | ||||
|  | ||||
| // Remainder elided | ||||
							
								
								
									
										39
									
								
								samples/Jison Lex/classy.jisonlex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/Jison Lex/classy.jisonlex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| digit                       [0-9] | ||||
| id                          [a-zA-Z][a-zA-Z0-9]* | ||||
|  | ||||
| %% | ||||
| "//".*                      /* ignore comment */ | ||||
| "main"                      return 'MAIN'; | ||||
| "class"                     return 'CLASS'; | ||||
| "extends"                   return 'EXTENDS'; | ||||
| "nat"                       return 'NATTYPE'; | ||||
| "if"                        return 'IF'; | ||||
| "else"                      return 'ELSE'; | ||||
| "for"                       return 'FOR'; | ||||
| "printNat"                  return 'PRINTNAT'; | ||||
| "readNat"                   return 'READNAT'; | ||||
| "this"                      return 'THIS'; | ||||
| "new"                       return 'NEW'; | ||||
| "var"                       return 'VAR'; | ||||
| "null"                      return 'NUL'; | ||||
| {digit}+                    return 'NATLITERAL'; | ||||
| {id}                        return 'ID'; | ||||
| "=="                        return 'EQUALITY'; | ||||
| "="                         return 'ASSIGN'; | ||||
| "+"                         return 'PLUS'; | ||||
| "-"                         return 'MINUS'; | ||||
| "*"                         return 'TIMES'; | ||||
| ">"                         return 'GREATER'; | ||||
| "||"                        return 'OR'; | ||||
| "!"                         return 'NOT'; | ||||
| "."                         return 'DOT'; | ||||
| "{"                         return 'LBRACE'; | ||||
| "}"                         return 'RBRACE'; | ||||
| "("                         return 'LPAREN'; | ||||
| ")"                         return 'RPAREN'; | ||||
| ";"                         return 'SEMICOLON'; | ||||
| \s+                         /* skip whitespace */ | ||||
| "."                         throw 'Illegal character'; | ||||
| <<EOF>>                     return 'ENDOFFILE'; | ||||
|  | ||||
|  | ||||
							
								
								
									
										29
									
								
								samples/Jison Lex/lex_grammar.jisonlex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/Jison Lex/lex_grammar.jisonlex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
|  | ||||
| %% | ||||
| \n+                         {yy.freshLine = true;} | ||||
| \s+                         {yy.freshLine = false;} | ||||
| "y{"[^}]*"}"                {yytext = yytext.substr(2, yyleng - 3); return 'ACTION';} | ||||
| [a-zA-Z_][a-zA-Z0-9_-]*     {return 'NAME';} | ||||
| '"'([^"]|'\"')*'"'          {return 'STRING_LIT';} | ||||
| "'"([^']|"\'")*"'"          {return 'STRING_LIT';} | ||||
| "|"                         {return '|';} | ||||
| "["("\]"|[^\]])*"]"         {return 'ANY_GROUP_REGEX';} | ||||
| "("                         {return '(';} | ||||
| ")"                         {return ')';} | ||||
| "+"                         {return '+';} | ||||
| "*"                         {return '*';} | ||||
| "?"                         {return '?';} | ||||
| "^"                         {return '^';} | ||||
| "/"                         {return '/';} | ||||
| "\\"[a-zA-Z0]               {return 'ESCAPE_CHAR';} | ||||
| "$"                         {return '$';} | ||||
| "<<EOF>>"                   {return '$';} | ||||
| "."                         {return '.';} | ||||
| "%%"                        {return '%%';} | ||||
| "{"\d+(","\s?\d+|",")?"}"   {return 'RANGE_REGEX';} | ||||
| /"{"                        %{if (yy.freshLine) { this.input('{'); return '{'; } else { this.unput('y'); }%} | ||||
| "}"                         %{return '}';%} | ||||
| "%{"(.|\n)*?"}%"            {yytext = yytext.substr(2, yyleng - 4); return 'ACTION';} | ||||
| .                           {/* ignore bad characters */} | ||||
| <<EOF>>                     {return 'EOF';} | ||||
|  | ||||
							
								
								
									
										418
									
								
								samples/Jison/ansic.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								samples/Jison/ansic.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
| %token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF | ||||
| %token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP | ||||
| %token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN | ||||
| %token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN | ||||
| %token XOR_ASSIGN OR_ASSIGN TYPE_NAME | ||||
|  | ||||
| %token TYPEDEF EXTERN STATIC AUTO REGISTER | ||||
| %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID | ||||
| %token STRUCT UNION ENUM ELLIPSIS | ||||
|  | ||||
| %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN | ||||
|  | ||||
| %nonassoc IF_WITHOUT_ELSE | ||||
| %nonassoc ELSE | ||||
|  | ||||
| %start translation_unit | ||||
| %% | ||||
|  | ||||
| primary_expression | ||||
|     : IDENTIFIER | ||||
|     | CONSTANT | ||||
|     | STRING_LITERAL | ||||
|     | '(' expression ')' | ||||
|     ; | ||||
|  | ||||
| postfix_expression | ||||
|     : primary_expression | ||||
|     | postfix_expression '[' expression ']' | ||||
|     | postfix_expression '(' ')' | ||||
|     | postfix_expression '(' argument_expression_list ')' | ||||
|     | postfix_expression '.' IDENTIFIER | ||||
|     | postfix_expression PTR_OP IDENTIFIER | ||||
|     | postfix_expression INC_OP | ||||
|     | postfix_expression DEC_OP | ||||
|     ; | ||||
|  | ||||
| argument_expression_list | ||||
|     : assignment_expression | ||||
|     | argument_expression_list ',' assignment_expression | ||||
|     ; | ||||
|  | ||||
| unary_expression | ||||
|     : postfix_expression | ||||
|     | INC_OP unary_expression | ||||
|     | DEC_OP unary_expression | ||||
|     | unary_operator cast_expression | ||||
|     | SIZEOF unary_expression | ||||
|     | SIZEOF '(' type_name ')' | ||||
|     ; | ||||
|  | ||||
| unary_operator | ||||
|     : '&' | ||||
|     | '*' | ||||
|     | '+' | ||||
|     | '-' | ||||
|     | '~' | ||||
|     | '!' | ||||
|     ; | ||||
|  | ||||
| cast_expression | ||||
|     : unary_expression | ||||
|     | '(' type_name ')' cast_expression | ||||
|     ; | ||||
|  | ||||
| multiplicative_expression | ||||
|     : cast_expression | ||||
|     | multiplicative_expression '*' cast_expression | ||||
|     | multiplicative_expression '/' cast_expression | ||||
|     | multiplicative_expression '%' cast_expression | ||||
|     ; | ||||
|  | ||||
| additive_expression | ||||
|     : multiplicative_expression | ||||
|     | additive_expression '+' multiplicative_expression | ||||
|     | additive_expression '-' multiplicative_expression | ||||
|     ; | ||||
|  | ||||
| shift_expression | ||||
|     : additive_expression | ||||
|     | shift_expression LEFT_OP additive_expression | ||||
|     | shift_expression RIGHT_OP additive_expression | ||||
|     ; | ||||
|  | ||||
| relational_expression | ||||
|     : shift_expression | ||||
|     | relational_expression '<' shift_expression | ||||
|     | relational_expression '>' shift_expression | ||||
|     | relational_expression LE_OP shift_expression | ||||
|     | relational_expression GE_OP shift_expression | ||||
|     ; | ||||
|  | ||||
| equality_expression | ||||
|     : relational_expression | ||||
|     | equality_expression EQ_OP relational_expression | ||||
|     | equality_expression NE_OP relational_expression | ||||
|     ; | ||||
|  | ||||
| and_expression | ||||
|     : equality_expression | ||||
|     | and_expression '&' equality_expression | ||||
|     ; | ||||
|  | ||||
| exclusive_or_expression | ||||
|     : and_expression | ||||
|     | exclusive_or_expression '^' and_expression | ||||
|     ; | ||||
|  | ||||
| inclusive_or_expression | ||||
|     : exclusive_or_expression | ||||
|     | inclusive_or_expression '|' exclusive_or_expression | ||||
|     ; | ||||
|  | ||||
| logical_and_expression | ||||
|     : inclusive_or_expression | ||||
|     | logical_and_expression AND_OP inclusive_or_expression | ||||
|     ; | ||||
|  | ||||
| logical_or_expression | ||||
|     : logical_and_expression | ||||
|     | logical_or_expression OR_OP logical_and_expression | ||||
|     ; | ||||
|  | ||||
| conditional_expression | ||||
|     : logical_or_expression | ||||
|     | logical_or_expression '?' expression ':' conditional_expression | ||||
|     ; | ||||
|  | ||||
| assignment_expression | ||||
|     : conditional_expression | ||||
|     | unary_expression assignment_operator assignment_expression | ||||
|     ; | ||||
|  | ||||
| assignment_operator | ||||
|     : '=' | ||||
|     | MUL_ASSIGN | ||||
|     | DIV_ASSIGN | ||||
|     | MOD_ASSIGN | ||||
|     | ADD_ASSIGN | ||||
|     | SUB_ASSIGN | ||||
|     | LEFT_ASSIGN | ||||
|     | RIGHT_ASSIGN | ||||
|     | AND_ASSIGN | ||||
|     | XOR_ASSIGN | ||||
|     | OR_ASSIGN | ||||
|     ; | ||||
|  | ||||
| expression | ||||
|     : assignment_expression | ||||
|     | expression ',' assignment_expression | ||||
|     ; | ||||
|  | ||||
| constant_expression | ||||
|     : conditional_expression | ||||
|     ; | ||||
|  | ||||
| declaration | ||||
|     : declaration_specifiers ';' | ||||
|     | declaration_specifiers init_declarator_list ';' | ||||
|     ; | ||||
|  | ||||
| declaration_specifiers | ||||
|     : storage_class_specifier | ||||
|     | storage_class_specifier declaration_specifiers | ||||
|     | type_specifier | ||||
|     | type_specifier declaration_specifiers | ||||
|     | type_qualifier | ||||
|     | type_qualifier declaration_specifiers | ||||
|     ; | ||||
|  | ||||
| init_declarator_list | ||||
|     : init_declarator | ||||
|     | init_declarator_list ',' init_declarator | ||||
|     ; | ||||
|  | ||||
| init_declarator | ||||
|     : declarator | ||||
|     | declarator '=' initializer | ||||
|     ; | ||||
|  | ||||
| storage_class_specifier | ||||
|     : TYPEDEF | ||||
|     | EXTERN | ||||
|     | STATIC | ||||
|     | AUTO | ||||
|     | REGISTER | ||||
|     ; | ||||
|  | ||||
| type_specifier | ||||
|     : VOID | ||||
|     | CHAR | ||||
|     | SHORT | ||||
|     | INT | ||||
|     | LONG | ||||
|     | FLOAT | ||||
|     | DOUBLE | ||||
|     | SIGNED | ||||
|     | UNSIGNED | ||||
|     | struct_or_union_specifier | ||||
|     | enum_specifier | ||||
|     | TYPE_NAME | ||||
|     ; | ||||
|  | ||||
| struct_or_union_specifier | ||||
|     : struct_or_union IDENTIFIER '{' struct_declaration_list '}' | ||||
|     | struct_or_union '{' struct_declaration_list '}' | ||||
|     | struct_or_union IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| struct_or_union | ||||
|     : STRUCT | ||||
|     | UNION | ||||
|     ; | ||||
|  | ||||
| struct_declaration_list | ||||
|     : struct_declaration | ||||
|     | struct_declaration_list struct_declaration | ||||
|     ; | ||||
|  | ||||
| struct_declaration | ||||
|     : specifier_qualifier_list struct_declarator_list ';' | ||||
|     ; | ||||
|  | ||||
| specifier_qualifier_list | ||||
|     : type_specifier specifier_qualifier_list | ||||
|     | type_specifier | ||||
|     | type_qualifier specifier_qualifier_list | ||||
|     | type_qualifier | ||||
|     ; | ||||
|  | ||||
| struct_declarator_list | ||||
|     : struct_declarator | ||||
|     | struct_declarator_list ',' struct_declarator | ||||
|     ; | ||||
|  | ||||
| struct_declarator | ||||
|     : declarator | ||||
|     | ':' constant_expression | ||||
|     | declarator ':' constant_expression | ||||
|     ; | ||||
|  | ||||
| enum_specifier | ||||
|     : ENUM '{' enumerator_list '}' | ||||
|     | ENUM IDENTIFIER '{' enumerator_list '}' | ||||
|     | ENUM IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| enumerator_list | ||||
|     : enumerator | ||||
|     | enumerator_list ',' enumerator | ||||
|     ; | ||||
|  | ||||
| enumerator | ||||
|     : IDENTIFIER | ||||
|     | IDENTIFIER '=' constant_expression | ||||
|     ; | ||||
|  | ||||
| type_qualifier | ||||
|     : CONST | ||||
|     | VOLATILE | ||||
|     ; | ||||
|  | ||||
| declarator | ||||
|     : pointer direct_declarator | ||||
|     | direct_declarator | ||||
|     ; | ||||
|  | ||||
| direct_declarator | ||||
|     : IDENTIFIER | ||||
|     | '(' declarator ')' | ||||
|     | direct_declarator '[' constant_expression ']' | ||||
|     | direct_declarator '[' ']' | ||||
|     | direct_declarator '(' parameter_type_list ')' | ||||
|     | direct_declarator '(' identifier_list ')' | ||||
|     | direct_declarator '(' ')' | ||||
|     ; | ||||
|  | ||||
| pointer | ||||
|     : '*' | ||||
|     | '*' type_qualifier_list | ||||
|     | '*' pointer | ||||
|     | '*' type_qualifier_list pointer | ||||
|     ; | ||||
|  | ||||
| type_qualifier_list | ||||
|     : type_qualifier | ||||
|     | type_qualifier_list type_qualifier | ||||
|     ; | ||||
|  | ||||
|  | ||||
| parameter_type_list | ||||
|     : parameter_list | ||||
|     | parameter_list ',' ELLIPSIS | ||||
|     ; | ||||
|  | ||||
| parameter_list | ||||
|     : parameter_declaration | ||||
|     | parameter_list ',' parameter_declaration | ||||
|     ; | ||||
|  | ||||
| parameter_declaration | ||||
|     : declaration_specifiers declarator | ||||
|     | declaration_specifiers abstract_declarator | ||||
|     | declaration_specifiers | ||||
|     ; | ||||
|  | ||||
| identifier_list | ||||
|     : IDENTIFIER | ||||
|     | identifier_list ',' IDENTIFIER | ||||
|     ; | ||||
|  | ||||
| type_name | ||||
|     : specifier_qualifier_list | ||||
|     | specifier_qualifier_list abstract_declarator | ||||
|     ; | ||||
|  | ||||
| abstract_declarator | ||||
|     : pointer | ||||
|     | direct_abstract_declarator | ||||
|     | pointer direct_abstract_declarator | ||||
|     ; | ||||
|  | ||||
| direct_abstract_declarator | ||||
|     : '(' abstract_declarator ')' | ||||
|     | '[' ']' | ||||
|     | '[' constant_expression ']' | ||||
|     | direct_abstract_declarator '[' ']' | ||||
|     | direct_abstract_declarator '[' constant_expression ']' | ||||
|     | '(' ')' | ||||
|     | '(' parameter_type_list ')' | ||||
|     | direct_abstract_declarator '(' ')' | ||||
|     | direct_abstract_declarator '(' parameter_type_list ')' | ||||
|     ; | ||||
|  | ||||
| initializer | ||||
|     : assignment_expression | ||||
|     | '{' initializer_list '}' | ||||
|     | '{' initializer_list ',' '}' | ||||
|     ; | ||||
|  | ||||
| initializer_list | ||||
|     : initializer | ||||
|     | initializer_list ',' initializer | ||||
|     ; | ||||
|  | ||||
| statement | ||||
|     : labeled_statement | ||||
|     | compound_statement | ||||
|     | expression_statement | ||||
|     | selection_statement | ||||
|     | iteration_statement | ||||
|     | jump_statement | ||||
|     ; | ||||
|  | ||||
| labeled_statement | ||||
|     : IDENTIFIER ':' statement | ||||
|     | CASE constant_expression ':' statement | ||||
|     | DEFAULT ':' statement | ||||
|     ; | ||||
|  | ||||
| compound_statement | ||||
|     : '{' '}' | ||||
|     | '{' statement_list '}' | ||||
|     | '{' declaration_list '}' | ||||
|     | '{' declaration_list statement_list '}' | ||||
|     ; | ||||
|  | ||||
| declaration_list | ||||
|     : declaration | ||||
|     | declaration_list declaration | ||||
|     ; | ||||
|  | ||||
| statement_list | ||||
|     : statement | ||||
|     | statement_list statement | ||||
|     ; | ||||
|  | ||||
| expression_statement | ||||
|     : ';' | ||||
|     | expression ';' | ||||
|     ; | ||||
|  | ||||
| selection_statement | ||||
|     : IF '(' expression ')' statement %prec IF_WITHOUT_ELSE | ||||
|     | IF '(' expression ')' statement ELSE statement | ||||
|     | SWITCH '(' expression ')' statement | ||||
|     ; | ||||
|  | ||||
| iteration_statement | ||||
|     : WHILE '(' expression ')' statement | ||||
|     | DO statement WHILE '(' expression ')' ';' | ||||
|     | FOR '(' expression_statement expression_statement ')' statement | ||||
|     | FOR '(' expression_statement expression_statement expression ')' statement | ||||
|     ; | ||||
|  | ||||
| jump_statement | ||||
|     : GOTO IDENTIFIER ';' | ||||
|     | CONTINUE ';' | ||||
|     | BREAK ';' | ||||
|     | RETURN ';' | ||||
|     | RETURN expression ';' | ||||
|     ; | ||||
|  | ||||
| translation_unit | ||||
|     : external_declaration | ||||
|     | translation_unit external_declaration | ||||
|     ; | ||||
|  | ||||
| external_declaration | ||||
|     : function_definition | ||||
|     | declaration | ||||
|     ; | ||||
|  | ||||
| function_definition | ||||
|     : declaration_specifiers declarator declaration_list compound_statement | ||||
|     | declaration_specifiers declarator compound_statement | ||||
|     | declarator declaration_list compound_statement | ||||
|     | declarator compound_statement | ||||
|     ; | ||||
							
								
								
									
										84
									
								
								samples/Jison/classy.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								samples/Jison/classy.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
|  | ||||
| /* description: ClassyLang grammar. Very classy. */ | ||||
| /* | ||||
|   To build parser: | ||||
|  | ||||
|     $ ./bin/jison examples/classy.jison examples/classy.jisonlex | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| /* author: Zach Carter */ | ||||
|  | ||||
| %right ASSIGN | ||||
| %left OR | ||||
| %nonassoc EQUALITY GREATER | ||||
| %left PLUS MINUS | ||||
| %left TIMES | ||||
| %right NOT | ||||
| %left DOT | ||||
|  | ||||
| %% | ||||
|  | ||||
| pgm | ||||
|     : cdl MAIN LBRACE vdl el RBRACE ENDOFFILE | ||||
|     ; | ||||
|  | ||||
| cdl | ||||
|     : c cdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| c | ||||
|     : CLASS id EXTENDS id LBRACE vdl mdl RBRACE | ||||
|     ; | ||||
|  | ||||
| vdl | ||||
|     : VAR t id SEMICOLON vdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| mdl | ||||
|     : t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| t | ||||
|     : NATTYPE | ||||
|     | id | ||||
|     ; | ||||
|  | ||||
| id | ||||
|     : ID | ||||
|     ; | ||||
|  | ||||
| el | ||||
|     : e SEMICOLON el | ||||
|     | e SEMICOLON | ||||
|     ; | ||||
|  | ||||
| e | ||||
|     : NATLITERAL | ||||
|     | NUL | ||||
|     | id | ||||
|     | NEW id | ||||
|     | THIS | ||||
|     | IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE | ||||
|     | FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE | ||||
|     | READNAT LPAREN RPAREN | ||||
|     | PRINTNAT LPAREN e RPAREN | ||||
|     | e PLUS e | ||||
|     | e MINUS e | ||||
|     | e TIMES e | ||||
|     | e EQUALITY e | ||||
|     | e GREATER e | ||||
|     | NOT e | ||||
|     | e OR e | ||||
|     | e DOT id | ||||
|     | id ASSIGN e | ||||
|     | e DOT id ASSIGN e | ||||
|     | id LPAREN e RPAREN | ||||
|     | e DOT id LPAREN e RPAREN | ||||
|     | LPAREN e RPAREN | ||||
|     ; | ||||
|  | ||||
							
								
								
									
										145
									
								
								samples/Jison/lex.jison
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Jison/lex.jison
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
|  | ||||
| // `%nonassoc` tells the parser compiler (JISON) that these tokens cannot occur more than once, | ||||
| // i.e. input like '//a' (tokens '/', '/' and 'a') is not a legal input while '/a' (tokens '/' and 'a') | ||||
| // *is* legal input for this grammar. | ||||
|   | ||||
| %nonassoc '/' '/!' | ||||
|  | ||||
| // Likewise for `%left`: this informs the LALR(1) grammar compiler (JISON) that these tokens | ||||
| // *can* occur repeatedly, e.g. 'a?*' and even 'a**' are considered legal inputs given this | ||||
| // grammar! | ||||
| // | ||||
| // Token `RANGE_REGEX` may seem the odd one out here but really isn't: given the `regex_base` | ||||
| // choice/rule `regex_base range_regex`, which is recursive, this grammar tells JISON that  | ||||
| // any input matching a sequence like `regex_base range_regex range_regex` *is* legal. | ||||
| // If you do not want that to be legal, you MUST adjust the grammar rule set you match your | ||||
| // actual intent. | ||||
|  | ||||
| %left '*' '+' '?' RANGE_REGEX | ||||
|  | ||||
|  | ||||
| %%  | ||||
|  | ||||
| lex  | ||||
|     : definitions include '%%' rules '%%' EOF | ||||
|         {{ $$ = {macros: $1, rules: $4}; | ||||
|           if ($2) $$.actionInclude = $2; | ||||
|           return $$; }} | ||||
|     | definitions include '%%' rules EOF | ||||
|         {{ $$ = {macros: $1, rules: $4}; | ||||
|           if ($2) $$.actionInclude = $2; | ||||
|           return $$; }} | ||||
|     ; | ||||
|  | ||||
| include | ||||
|     : action | ||||
|     | | ||||
|     ; | ||||
|  | ||||
| definitions | ||||
|     : definitions definition | ||||
|         { $$ = $1; $$.concat($2); } | ||||
|     | definition | ||||
|         { $$ = [$1]; } | ||||
|     ; | ||||
|  | ||||
| definition | ||||
|     : name regex | ||||
|         { $$ = [$1, $2]; } | ||||
|     ; | ||||
|  | ||||
| name | ||||
|     : NAME | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| rules | ||||
|     : rules rule | ||||
|         { $$ = $1; $$.push($2); } | ||||
|     | rule | ||||
|         { $$ = [$1]; } | ||||
|     ; | ||||
|  | ||||
| rule | ||||
|     : regex action | ||||
|         { $$ = [$1, $2]; } | ||||
|     ; | ||||
|  | ||||
| action | ||||
|     : ACTION  | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| regex | ||||
|     : start_caret regex_list end_dollar | ||||
|         { $$ = $1+$2+$3; } | ||||
|     ; | ||||
|  | ||||
| start_caret | ||||
|     : '^' | ||||
|         { $$ = '^'; } | ||||
|     | | ||||
|         { $$ = ''; } | ||||
|     ; | ||||
|  | ||||
| end_dollar | ||||
|     : '$' | ||||
|         { $$ = '$'; } | ||||
|     | | ||||
|         { $$ = ''; } | ||||
|     ; | ||||
|  | ||||
| regex_list | ||||
|     : regex_list '|' regex_chain | ||||
|         { $$ = $1+'|'+$3; } | ||||
|     | regex_chain | ||||
|     ; | ||||
|  | ||||
| regex_chain | ||||
|     : regex_chain regex_base | ||||
|         { $$ = $1+$2;} | ||||
|     | regex_base | ||||
|         { $$ = $1;} | ||||
|     ; | ||||
|  | ||||
| regex_base | ||||
|     : '(' regex_list ')' | ||||
|         { $$ = '('+$2+')'; } | ||||
|     | regex_base '+' | ||||
|         { $$ = $1+'+'; } | ||||
|     | regex_base '*' | ||||
|         { $$ = $1+'*'; } | ||||
|     | regex_base '?' | ||||
|         { $$ = $1+'?'; } | ||||
|     | '/' regex_base | ||||
|         { $$ = '(?=' + $regex_base + ')'; } | ||||
|     | '/!' regex_base | ||||
|         { $$ = '(?!' + $regex_base + ')'; } | ||||
|     | name_expansion | ||||
|     | regex_base range_regex | ||||
|         { $$ = $1+$2; } | ||||
|     | any_group_regex | ||||
|     | '.' | ||||
|         { $$ = '.'; } | ||||
|     | string | ||||
|     ; | ||||
|  | ||||
| name_expansion | ||||
|     : '{' name '}' | ||||
|         {{ $$ = '{'+$2+'}'; }} | ||||
|     ; | ||||
|  | ||||
| any_group_regex | ||||
|     : ANY_GROUP_REGEX | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| range_regex | ||||
|     : RANGE_REGEX | ||||
|         { $$ = yytext; } | ||||
|     ; | ||||
|  | ||||
| string | ||||
|     : STRING_LIT | ||||
|         { $$ = yy.prepareString(yytext.substr(1, yyleng-2)); } | ||||
|     ; | ||||
							
								
								
									
										49
									
								
								samples/LookML/example.model.lkml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/LookML/example.model.lkml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| - label:          'desired label name' | ||||
| - connection:     connection_name | ||||
| - include:        filename_or_pattern | ||||
|   # Possibly more include declarations | ||||
| - persist_for:    N (seconds | minutes | hours) | ||||
| - case_sensitive: true | false | ||||
| - week_start_day: monday | tuesday | wednesday | thursday | friday | saturday | sunday | ||||
| - value_formats: | ||||
|   - name: desired_format_name | ||||
|     value_format: 'excel-style formatting string' | ||||
|   # Possibly more value formats | ||||
|  | ||||
| - explore: view_name | ||||
|   label:  'desired label name' | ||||
|   description: 'description string' | ||||
|   symmetric_aggregates: true | false | ||||
|   hidden: true | false | ||||
|   fields: [field_or_set, field_or_set, …] | ||||
|  | ||||
|   sql_always_where: SQL WHERE condition | ||||
|   always_filter: | ||||
|     field_name: 'looker filter expression' | ||||
|   conditionally_filter: | ||||
|     field_name: 'looker filter expression' | ||||
|     unless: [field_or_set, field_or_set, …] | ||||
|   access_filter_fields: [fully_scoped_field, fully_scoped_field, …] | ||||
|  | ||||
|   always_join: [view_name, view_name, …] | ||||
|   joins: | ||||
|     - join: view_name | ||||
|       type: left_outer | full_outer | inner | cross | ||||
|       relationship: one_to_one | many_to_one | one_to_many | many_to_many | ||||
|       from: view_name | ||||
|       sql_table_name: table_name | ||||
|       view_label: 'desired label name' | ||||
|       fields: [field_or_set, field_or_set, …] | ||||
|       required_joins: [view_name, view_name, …] | ||||
|       foreign_key: dimension_name | ||||
|       sql_on: SQL ON clause | ||||
|     # Possibly more join declarations | ||||
|  | ||||
|   persist_for: N (seconds | minutes | hours) | ||||
|   from: view_name | ||||
|   view: view_name | ||||
|   case_sensitive: true | false | ||||
|   sql_table_name: table_name | ||||
|   cancel_grouping_fields: [fully_scoped_field, fully_scoped_field, …] | ||||
|  | ||||
| # Possibly more explore declarations | ||||
							
								
								
									
										90
									
								
								samples/LookML/example.view.lkml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								samples/LookML/example.view.lkml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| - view: view_name | ||||
|   sql_table_name: table_name | ||||
|   suggestions: true | false | ||||
|  | ||||
|   derived_table: | ||||
|     sql: SQL query | ||||
|     persist_for: N (seconds | minutes | hours) | ||||
|     sql_trigger_value: SQL query | ||||
|     distribution: column_name | ||||
|     distribution_style: ALL | EVEN | ||||
|     sortkeys: [column_name, column_name, …] | ||||
|     indexes: [column_name, column_name, …] | ||||
|  | ||||
|   sets: | ||||
|     set_name: | ||||
|       - field_or_set | ||||
|       - field_or_set | ||||
|       - … | ||||
|     # Possibly more set declarations | ||||
|  | ||||
|   fields: | ||||
|   - (dimension | dimension_group | measure | filter): field_name | ||||
|     label: 'desired label name' | ||||
|     view_label: 'desired label name' | ||||
|     group_label: 'desired label name' | ||||
|     description: 'description string' | ||||
|     hidden: true | false | ||||
|     alias: [old_field_name, old_field_name, …] | ||||
|     value_format: 'excel-style formatting string' | ||||
|     value_format_name: format_name | ||||
|     html: HTML expression using Liquid template elements | ||||
|     sql: SQL expression to generate the field value | ||||
|     required_fields: [field_name, field_name, …] | ||||
|     drill_fields: [field_or_set, field_or_set, …] | ||||
|     can_filter: true | false | ||||
|     fanout_on: repeated_record_name | ||||
|  | ||||
|     # DIMENSION SPECIFIC PARAMETERS | ||||
|  | ||||
|     type: dimension_field_type | ||||
|     primary_key: true | false | ||||
|     sql_case: | ||||
|       value: SQL condition | ||||
|       value: SQL condition | ||||
|       # Possibly more sql_case statements | ||||
|     alpha_sort: true | false | ||||
|     tiers: [N, N, …] | ||||
|     style: classic | interval | integer | relational | ||||
|     sql_latitude: SQL expression to generate a latitude | ||||
|     sql_longitude: SQL expression to generate a longitude | ||||
|     suggestable: true | false | ||||
|     suggest_persist_for: N (seconds | minutes | hours) | ||||
|     suggest_dimension: dimension_name | ||||
|     suggest_explore: explore_name | ||||
|     suggestions: ['suggestion string', 'suggestion string', …] | ||||
|     bypass_suggest_restrictions: true | false | ||||
|     full_suggestions: true | false | ||||
|     skip_drill_filter: true | false | ||||
|     case_sensitive: true | false | ||||
|     order_by_field: dimension_name | ||||
|     map_layer: name_of_map_layer | ||||
|     links: | ||||
|       - label: 'desired label name' | ||||
|         url: desired_url | ||||
|         icon_url: url_of_an_ico_file | ||||
|       # Possibly more links | ||||
|  | ||||
|     # DIMENSION GROUP SPECIFIC PARAMETERS | ||||
|  | ||||
|     timeframes: [timeframe, timeframe, …] | ||||
|     convert_tz: true | false | ||||
|     datatype: epoch | timestamp | datetime | date | yyyymmdd | ||||
|  | ||||
|     # MEASURE SPECIFIC PARAMETERS | ||||
|  | ||||
|     type: measure_field_type | ||||
|     direction: row | column | ||||
|     approximate: true | false | ||||
|     approximate_threshold: N | ||||
|     sql_distinct_key: SQL expression to define repeated entities | ||||
|     list_field: dimension_name | ||||
|     filters: | ||||
|       dimension_name: 'looker filter expression' | ||||
|       # Possibly more filters statements | ||||
|  | ||||
|     # FILTER SPECIFIC PARAMETERS | ||||
|  | ||||
|     default_value: 'desired default value' | ||||
|  | ||||
|   # Possibly more dimension or measure declarations | ||||
| @@ -1,9 +1,14 @@ | ||||
| --- | ||||
| type: grammar | ||||
| name: css.tmbundle | ||||
| license: permissive | ||||
| curated: true | ||||
| --- | ||||
| # Installation | ||||
| 
 | ||||
| You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. | ||||
| 
 | ||||
| # General | ||||
| 
 | ||||
| * [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_ | ||||
| * [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_ | ||||
| * [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_ | ||||
| 
 | ||||
| # License | ||||
| 
 | ||||
| If not otherwise specified (see below), files in this repository fall under the following license: | ||||
| 
 | ||||
| @@ -12,4 +17,4 @@ If not otherwise specified (see below), files in this repository fall under the | ||||
| 	express or implied warranty, and with no claim as to its | ||||
| 	suitability for any purpose. | ||||
| 
 | ||||
| An exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”. | ||||
| An exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”. | ||||
							
								
								
									
										1
									
								
								samples/Markdown/minimal.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Markdown/minimal.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| _This_ is a **Markdown** readme. | ||||
							
								
								
									
										26
									
								
								samples/Marko/counter.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								samples/Marko/counter.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| class { | ||||
|     constructor() { | ||||
|         this.state = { count:0 }; | ||||
|     } | ||||
|     increment() { | ||||
|         this.state.count++; | ||||
|     } | ||||
| } | ||||
|  | ||||
| style { | ||||
|     .count { | ||||
|         color:#09c; | ||||
|         font-size:3em; | ||||
|     } | ||||
|     .example-button { | ||||
|         font-size:1em; | ||||
|         padding:0.5em; | ||||
|     } | ||||
| } | ||||
|  | ||||
| <div.count> | ||||
|     ${state.count} | ||||
| </div> | ||||
| <button.example-button on-click('increment')> | ||||
|     Click me! | ||||
| </button> | ||||
							
								
								
									
										15
									
								
								samples/Marko/hello.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Marko/hello.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| $ var name = 'Frank'; | ||||
| $ var colors = ['red', 'green', 'blue']; | ||||
|  | ||||
| <h1> | ||||
|     Hello ${name}! | ||||
| </h1> | ||||
|  | ||||
| <ul if(colors.length)> | ||||
|     <li style={color: color} for(color in colors)> | ||||
|         ${color} | ||||
|     </li> | ||||
| </ul> | ||||
| <div else> | ||||
|     No colors! | ||||
| </div> | ||||
							
								
								
									
										36
									
								
								samples/Marko/rgb-sliders.marko
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								samples/Marko/rgb-sliders.marko
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| static const colors = ['red', 'green', 'blue']; | ||||
| static const defaultColor = [255, 0, 0]; | ||||
|  | ||||
| class { | ||||
| 	onInput(input) { | ||||
| 		this.state = { color: input.color || defaultColor }; | ||||
| 	} | ||||
|  | ||||
| 	updateColor() { | ||||
|     	this.state.color = colors.map((color) => { | ||||
|         	return parseInt(this.getEl(color + 'Input').value, 10); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     getStyleColor() { | ||||
|     	return 'rgb(' + this.state.color.join(',') + ')'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| <div.rgb-sliders> | ||||
|     <div.inputs> | ||||
|     	<for(i, color in colors)> | ||||
|         	<div> | ||||
|                 <label for-key=color+"Input"> | ||||
|                     ${color}: | ||||
|                 </label> | ||||
|                 <input type="range" max="255" | ||||
|                     key=color+"Input" | ||||
|                     on-input('updateColor') | ||||
|                     value=state.color[i] > | ||||
|             </div> | ||||
|         </for> | ||||
|     </div> | ||||
|     <div.color style={backgroundColor: component.getStyleColor()}> | ||||
|     </div> | ||||
| </div> | ||||
							
								
								
									
										51
									
								
								samples/Meson/filenames/meson.build
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								samples/Meson/filenames/meson.build
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| project('test', ['c'], | ||||
|   version: '0.1.0' | ||||
| ) | ||||
|  | ||||
| # This is a comment test('foo') | ||||
|  | ||||
| add_global_arguments(['-foo']) | ||||
| add_global_link_arguments(['-foo']) | ||||
|  | ||||
| gnome = import('gnome') # As is this | ||||
|  | ||||
| gnome.do_something('test') | ||||
|  | ||||
| meson.source_root() | ||||
|  | ||||
| foreach foo: bar | ||||
|   foreach baz : foo | ||||
|     message(baz) | ||||
|   endforeach | ||||
| endforeach | ||||
|  | ||||
| blah = ''' | ||||
| afjoakjflajf  # Test | ||||
| lflkasjf | ||||
| test\'test | ||||
| test\\\\test | ||||
| test\ntest | ||||
| ''' | ||||
|  | ||||
| foo = '' | ||||
| foo = '''''' | ||||
| foo = 'string' | ||||
| foo = '''string2''' | ||||
| foo = 12314 | ||||
| foo = 1231.1231 | ||||
| foo = true | ||||
| foo = false | ||||
| foo = ['te\'st', 1, 3.3, '''test'''] | ||||
| foo += 1231 | ||||
| foo = '@0@'.format('test') | ||||
| foo = include_directories('foo', kwarg: 'bar', include_directories: 'foo') | ||||
| foo = true ? 'true' : 'false' | ||||
| foo = 2 - 1 + 3 % 8 / 4 * 3 | ||||
|  | ||||
| if true and false | ||||
| elif false or true | ||||
| elif true not false | ||||
| elif foo == 12 | ||||
| elif (foo != 124) and (foo <= 200) | ||||
| else | ||||
| endif | ||||
							
								
								
									
										3
									
								
								samples/Meson/filenames/meson_options.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/Meson/filenames/meson_options.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| option('with-something', type: 'boolean', | ||||
|   value: true, | ||||
| ) | ||||
							
								
								
									
										329
									
								
								samples/P4/l2.p4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								samples/P4/l2.p4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,329 @@ | ||||
| /* | ||||
| Copyright 2013-present Barefoot Networks, Inc.  | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
|  | ||||
|     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
|  | ||||
| /* | ||||
|  * Layer-2 processing | ||||
|  */ | ||||
|  | ||||
| header_type l2_metadata_t { | ||||
|     fields { | ||||
|         lkp_pkt_type : 3; | ||||
|         lkp_mac_sa : 48; | ||||
|         lkp_mac_da : 48; | ||||
|         lkp_mac_type : 16; | ||||
|  | ||||
|         l2_nexthop : 16;                       /* next hop from l2 */ | ||||
|         l2_nexthop_type : 1;                   /* ecmp or nexthop */ | ||||
|         l2_redirect : 1;                       /* l2 redirect action */ | ||||
|         l2_src_miss : 1;                       /* l2 source miss */ | ||||
|         l2_src_move : IFINDEX_BIT_WIDTH;       /* l2 source interface mis-match */ | ||||
|         stp_group: 10;                         /* spanning tree group id */ | ||||
|         stp_state : 3;                         /* spanning tree port state */ | ||||
|         bd_stats_idx : 16;                     /* ingress BD stats index */ | ||||
|         learning_enabled : 1;                  /* is learning enabled */ | ||||
|         port_vlan_mapping_miss : 1;            /* port vlan mapping miss */ | ||||
|         same_if_check : IFINDEX_BIT_WIDTH;     /* same interface check */ | ||||
|     } | ||||
| } | ||||
|  | ||||
| metadata l2_metadata_t l2_metadata; | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* Spanning tree lookup                                                      */ | ||||
| /*****************************************************************************/ | ||||
| action set_stp_state(stp_state) { | ||||
|     modify_field(l2_metadata.stp_state, stp_state); | ||||
| } | ||||
|  | ||||
| table spanning_tree { | ||||
|     reads { | ||||
|         ingress_metadata.ifindex : exact; | ||||
|         l2_metadata.stp_group: exact; | ||||
|     } | ||||
|     actions { | ||||
|         set_stp_state; | ||||
|     } | ||||
|     size : SPANNING_TREE_TABLE_SIZE; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_spanning_tree { | ||||
| #ifndef L2_DISABLE | ||||
|     if (l2_metadata.stp_group != STP_GROUP_NONE) { | ||||
|         apply(spanning_tree); | ||||
|     } | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* Source MAC lookup                                                         */ | ||||
| /*****************************************************************************/ | ||||
| action smac_miss() { | ||||
|     modify_field(l2_metadata.l2_src_miss, TRUE); | ||||
| } | ||||
|  | ||||
| action smac_hit(ifindex) { | ||||
|     bit_xor(l2_metadata.l2_src_move, ingress_metadata.ifindex, ifindex); | ||||
| } | ||||
|  | ||||
| table smac { | ||||
|     reads { | ||||
|         ingress_metadata.bd : exact; | ||||
|         l2_metadata.lkp_mac_sa : exact; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         smac_miss; | ||||
|         smac_hit; | ||||
|     } | ||||
|     size : MAC_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Destination MAC lookup                                                    */ | ||||
| /*****************************************************************************/ | ||||
| action dmac_hit(ifindex) { | ||||
|     modify_field(ingress_metadata.egress_ifindex, ifindex); | ||||
|     bit_xor(l2_metadata.same_if_check, l2_metadata.same_if_check, ifindex); | ||||
| } | ||||
|  | ||||
| action dmac_multicast_hit(mc_index) { | ||||
|     modify_field(intrinsic_metadata.mcast_grp, mc_index); | ||||
| #ifdef FABRIC_ENABLE | ||||
|     modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST); | ||||
| #endif /* FABRIC_ENABLE */ | ||||
| } | ||||
|  | ||||
| action dmac_miss() { | ||||
|     modify_field(ingress_metadata.egress_ifindex, IFINDEX_FLOOD); | ||||
| #ifdef FABRIC_ENABLE | ||||
|     modify_field(fabric_metadata.dst_device, FABRIC_DEVICE_MULTICAST); | ||||
| #endif /* FABRIC_ENABLE */ | ||||
| } | ||||
|  | ||||
| action dmac_redirect_nexthop(nexthop_index) { | ||||
|     modify_field(l2_metadata.l2_redirect, TRUE); | ||||
|     modify_field(l2_metadata.l2_nexthop, nexthop_index); | ||||
|     modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_SIMPLE); | ||||
| } | ||||
|  | ||||
| action dmac_redirect_ecmp(ecmp_index) { | ||||
|     modify_field(l2_metadata.l2_redirect, TRUE); | ||||
|     modify_field(l2_metadata.l2_nexthop, ecmp_index); | ||||
|     modify_field(l2_metadata.l2_nexthop_type, NEXTHOP_TYPE_ECMP); | ||||
| } | ||||
|  | ||||
| action dmac_drop() { | ||||
|     drop(); | ||||
| } | ||||
|  | ||||
| table dmac { | ||||
|     reads { | ||||
|         ingress_metadata.bd : exact; | ||||
|         l2_metadata.lkp_mac_da : exact; | ||||
|     } | ||||
|     actions { | ||||
| #ifdef OPENFLOW_ENABLE | ||||
|         openflow_apply; | ||||
|         openflow_miss; | ||||
| #endif /* OPENFLOW_ENABLE */ | ||||
|         nop; | ||||
|         dmac_hit; | ||||
|         dmac_multicast_hit; | ||||
|         dmac_miss; | ||||
|         dmac_redirect_nexthop; | ||||
|         dmac_redirect_ecmp; | ||||
|         dmac_drop; | ||||
|     } | ||||
|     size : MAC_TABLE_SIZE; | ||||
|     support_timeout: true; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_mac { | ||||
| #ifndef L2_DISABLE | ||||
|     apply(smac); | ||||
|     apply(dmac); | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
| #ifndef L2_DISABLE | ||||
| /*****************************************************************************/ | ||||
| /* MAC learn notification                                                    */ | ||||
| /*****************************************************************************/ | ||||
| field_list mac_learn_digest { | ||||
|     ingress_metadata.bd; | ||||
|     l2_metadata.lkp_mac_sa; | ||||
|     ingress_metadata.ifindex; | ||||
| } | ||||
|  | ||||
| action generate_learn_notify() { | ||||
|     generate_digest(MAC_LEARN_RECEIVER, mac_learn_digest); | ||||
| } | ||||
|  | ||||
| table learn_notify { | ||||
|     reads { | ||||
|         l2_metadata.l2_src_miss : ternary; | ||||
|         l2_metadata.l2_src_move : ternary; | ||||
|         l2_metadata.stp_state : ternary; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         generate_learn_notify; | ||||
|     } | ||||
|     size : LEARN_NOTIFY_TABLE_SIZE; | ||||
| } | ||||
| #endif /* L2_DISABLE */ | ||||
|  | ||||
| control process_mac_learning { | ||||
| #ifndef L2_DISABLE | ||||
|     if (l2_metadata.learning_enabled == TRUE) { | ||||
|         apply(learn_notify); | ||||
|     } | ||||
| #endif /* L2_DISABLE */ | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Validate packet                                                           */ | ||||
| /*****************************************************************************/ | ||||
| action set_unicast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST); | ||||
| } | ||||
|  | ||||
| action set_unicast_and_ipv6_src_is_link_local() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_UNICAST); | ||||
|     modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE); | ||||
| } | ||||
|  | ||||
| action set_multicast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 1); | ||||
| } | ||||
|  | ||||
| action set_multicast_and_ipv6_src_is_link_local() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_MULTICAST); | ||||
|     modify_field(ipv6_metadata.ipv6_src_is_link_local, TRUE); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 1); | ||||
| } | ||||
|  | ||||
| action set_broadcast() { | ||||
|     modify_field(l2_metadata.lkp_pkt_type, L2_BROADCAST); | ||||
|     add_to_field(l2_metadata.bd_stats_idx, 2); | ||||
| } | ||||
|  | ||||
| action set_malformed_packet(drop_reason) { | ||||
|     modify_field(ingress_metadata.drop_flag, TRUE); | ||||
|     modify_field(ingress_metadata.drop_reason, drop_reason); | ||||
| } | ||||
|  | ||||
| table validate_packet { | ||||
|     reads { | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         l2_metadata.lkp_mac_sa mask 0x010000000000 : ternary; | ||||
| #else | ||||
|         l2_metadata.lkp_mac_sa : ternary; | ||||
| #endif | ||||
|         l2_metadata.lkp_mac_da : ternary; | ||||
|         l3_metadata.lkp_ip_type : ternary; | ||||
|         l3_metadata.lkp_ip_ttl : ternary; | ||||
|         l3_metadata.lkp_ip_version : ternary; | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         ipv4_metadata.lkp_ipv4_sa mask 0xFF000000 : ternary; | ||||
| #else | ||||
|         ipv4_metadata.lkp_ipv4_sa : ternary; | ||||
| #endif | ||||
| #ifndef IPV6_DISABLE | ||||
| #ifndef __TARGET_BMV2__ | ||||
|         ipv6_metadata.lkp_ipv6_sa mask 0xFFFF0000000000000000000000000000 : ternary; | ||||
| #else | ||||
|         ipv6_metadata.lkp_ipv6_sa : ternary; | ||||
| #endif | ||||
| #endif /* IPV6_DISABLE */ | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_unicast; | ||||
|         set_unicast_and_ipv6_src_is_link_local; | ||||
|         set_multicast; | ||||
|         set_multicast_and_ipv6_src_is_link_local; | ||||
|         set_broadcast; | ||||
|         set_malformed_packet; | ||||
|     } | ||||
|     size : VALIDATE_PACKET_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_validate_packet { | ||||
|     if (ingress_metadata.drop_flag == FALSE) { | ||||
|         apply(validate_packet); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Egress BD lookup                                                          */ | ||||
| /*****************************************************************************/ | ||||
| action set_egress_bd_properties() { | ||||
| } | ||||
|  | ||||
| table egress_bd_map { | ||||
|     reads { | ||||
|         egress_metadata.bd : exact; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_egress_bd_properties; | ||||
|     } | ||||
|     size : EGRESS_BD_MAPPING_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_egress_bd { | ||||
|     apply(egress_bd_map); | ||||
| } | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /* Egress VLAN decap                                                         */ | ||||
| /*****************************************************************************/ | ||||
| action remove_vlan_single_tagged() { | ||||
|     modify_field(ethernet.etherType, vlan_tag_[0].etherType); | ||||
|     remove_header(vlan_tag_[0]); | ||||
| } | ||||
|  | ||||
| action remove_vlan_double_tagged() { | ||||
|     modify_field(ethernet.etherType, vlan_tag_[1].etherType); | ||||
|     remove_header(vlan_tag_[0]); | ||||
|     remove_header(vlan_tag_[1]); | ||||
| } | ||||
|  | ||||
| table vlan_decap { | ||||
|     reads { | ||||
|         vlan_tag_[0] : valid; | ||||
|         vlan_tag_[1] : valid; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         remove_vlan_single_tagged; | ||||
|         remove_vlan_double_tagged; | ||||
|     } | ||||
|     size: VLAN_DECAP_TABLE_SIZE; | ||||
| } | ||||
|  | ||||
| control process_vlan_decap { | ||||
|     apply(vlan_decap); | ||||
| } | ||||
							
								
								
									
										39
									
								
								samples/P4/mirror_acl.p4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/P4/mirror_acl.p4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| // Copyright 2015, Barefoot Networks, Inc. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| action set_mirror_id(session_id) { | ||||
|     clone_ingress_pkt_to_egress(session_id); | ||||
| } | ||||
|  | ||||
| table mirror_acl { | ||||
|     reads { | ||||
|         ingress_metadata.if_label : ternary; | ||||
|         ingress_metadata.bd_label : ternary; | ||||
|  | ||||
|         /* ip acl */ | ||||
|         ingress_metadata.lkp_ipv4_sa : ternary; | ||||
|         ingress_metadata.lkp_ipv4_da : ternary; | ||||
|         ingress_metadata.lkp_ip_proto : ternary; | ||||
|  | ||||
|         /* mac acl */ | ||||
|         ingress_metadata.lkp_mac_sa : ternary; | ||||
|         ingress_metadata.lkp_mac_da : ternary; | ||||
|         ingress_metadata.lkp_mac_type : ternary; | ||||
|     } | ||||
|     actions { | ||||
|         nop; | ||||
|         set_mirror_id; | ||||
|     } | ||||
|     size : INGRESS_MIRROR_ACL_TABLE_SIZE; | ||||
| } | ||||
							
								
								
									
										12
									
								
								samples/Python/filenames/WORKSPACE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								samples/Python/filenames/WORKSPACE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| # rules for scala | ||||
| # https://github.com/bazelbuild/rules_scala#getting-started | ||||
| # pull rule definitions from git | ||||
| git_repository( | ||||
|     name = "io_bazel_rules_scala", | ||||
|     remote = "https://github.com/bazelbuild/rules_scala.git", | ||||
|     commit = "73743b830ae98d13a946b25ad60cad5fee58e6d3", # update this as needed | ||||
| ) | ||||
|  | ||||
| # load the desired scala rules for this workspace | ||||
| load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories") | ||||
| scala_repositories() | ||||
							
								
								
									
										72
									
								
								samples/R/import.Rd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/R/import.Rd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| % Generated by roxygen2: do not edit by hand | ||||
| % Please edit documentation in R/hello.R | ||||
| \name{import} | ||||
| \alias{import} | ||||
| \title{Import a module into the current scope} | ||||
| \usage{ | ||||
| import(module, attach, attach_operators = TRUE) | ||||
| } | ||||
| \arguments{ | ||||
| \item{module}{an identifier specifying the full module path} | ||||
|  | ||||
| \item{attach}{if \code{TRUE}, attach the newly loaded module to the object | ||||
| search path (see \code{Details})} | ||||
|  | ||||
| \item{attach_operators}{if \code{TRUE}, attach operators of module to the | ||||
| object search path, even if \code{attach} is \code{FALSE}} | ||||
| } | ||||
| \value{ | ||||
| the loaded module environment (invisible) | ||||
| } | ||||
| \description{ | ||||
| \code{module = import('module')} imports a specified module and makes its | ||||
| code available via the environment-like object it returns. | ||||
| } | ||||
| \details{ | ||||
| Modules are loaded in an isolated environment which is returned, and | ||||
| optionally attached to the object search path of the current scope (if | ||||
| argument \code{attach} is \code{TRUE}). | ||||
| \code{attach} defaults to \code{FALSE}. However, in interactive code it is | ||||
| often helpful to attach packages by default. Therefore, in interactive code | ||||
| invoked directly from the terminal only (i.e. not within modules), | ||||
| \code{attach} defaults to the value of \code{options('import.attach')}, which | ||||
| can be set to \code{TRUE} or \code{FALSE} depending on the user’s preference. | ||||
|  | ||||
| \code{attach_operators} causes \emph{operators} to be attached by default, | ||||
| because operators can only be invoked in R if they re found in the search | ||||
| path. Not attaching them therefore drastically limits a module’s usefulness. | ||||
|  | ||||
| Modules are searched in the module search path \code{options('import.path')}. | ||||
| This is a vector of paths to consider, from the highest to the lowest | ||||
| priority. The current directory is \emph{always} considered first. That is, | ||||
| if a file \code{a.r} exists both in the current directory and in a module | ||||
| search path, the local file \code{./a.r} will be loaded. | ||||
|  | ||||
| Module names can be fully qualified to refer to nested paths. See | ||||
| \code{Examples}. | ||||
| } | ||||
| \note{ | ||||
| Unlike for packages, attaching happens \emph{locally}: if | ||||
| \code{import} is executed in the global environment, the effect is the same. | ||||
| Otherwise, the imported module is inserted as the parent of the current | ||||
| \code{environment()}. When used (globally) \emph{inside} a module, the newly | ||||
| imported module is only available inside the module’s search path, not | ||||
| outside it (nor in other modules which might be loaded). | ||||
| } | ||||
| \examples{ | ||||
| # `a.r` is a file in the local directory containing a function `f`. | ||||
| a = import('a') | ||||
| a$f() | ||||
|  | ||||
| # b/c.r is a file in path `b`, containing a function `g`. | ||||
| import('b/c', attach = TRUE) | ||||
| g() # No module name qualification necessary | ||||
|  | ||||
| } | ||||
| \seealso{ | ||||
| \code{unload} | ||||
|  | ||||
| \code{reload} | ||||
|  | ||||
| \code{module_name} | ||||
| } | ||||
							
								
								
									
										483
									
								
								samples/Reason/JSX.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										483
									
								
								samples/Reason/JSX.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,483 @@ | ||||
| type component = {displayName: string}; | ||||
|  | ||||
| let module Bar = { | ||||
|   let createElement c::c=? children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Nesting = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Much = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Foo = { | ||||
|   let createElement a::a=? b::b=? children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module One = { | ||||
|   let createElement | ||||
|       test::test=? | ||||
|       foo::foo=? | ||||
|       children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
|   let createElementobvioustypo | ||||
|       test::test | ||||
|       children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Two = { | ||||
|   let createElement foo::foo=? children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Sibling = { | ||||
|   let createElement | ||||
|       foo::foo=? | ||||
|       (children: list component) => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Test = { | ||||
|   let createElement yo::yo=? children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module So = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Foo2 = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Text = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Exp = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Pun = { | ||||
|   let createElement intended::intended=? children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Namespace = { | ||||
|   let module Foo = { | ||||
|     let createElement | ||||
|         intended::intended=? | ||||
|         anotherOptional::x=100 | ||||
|         children => { | ||||
|       displayName: "test" | ||||
|     }; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module LotsOfArguments = { | ||||
|   let createElement | ||||
|       argument1::argument1=? | ||||
|       argument2::argument2=? | ||||
|       argument3::argument3=? | ||||
|       argument4::argument4=? | ||||
|       argument5::argument5=? | ||||
|       argument6::argument6=? | ||||
|       children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let div argument1::argument1=? children => { | ||||
|   displayName: "test" | ||||
| }; | ||||
|  | ||||
| let module List1 = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module List2 = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module List3 = { | ||||
|   let createElement children => { | ||||
|     displayName: "test" | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let (/><) a b => a + b; | ||||
|  | ||||
| let (><) a b => a + b; | ||||
|  | ||||
| let (/>) a b => a + b; | ||||
|  | ||||
| let (><\/) a b => a + b; | ||||
|  | ||||
| let tag1 = 5 />< 6; | ||||
|  | ||||
| let tag2 = 5 >< 7; | ||||
|  | ||||
| let tag3 = 5 /> 7; | ||||
|  | ||||
| let tag4 = 5 ><\/ 7; | ||||
|  | ||||
| let b = 2; | ||||
|  | ||||
| let selfClosing = <Foo />; | ||||
|  | ||||
| let selfClosing2 = <Foo a=1 b=true />; | ||||
|  | ||||
| let selfClosing3 = | ||||
|   <Foo | ||||
|     a="really long values that should" | ||||
|     b="cause the entire thing to wrap" | ||||
|   />; | ||||
|  | ||||
| let a = <Foo> <Bar c=(fun a => a + 2) /> </Foo>; | ||||
|  | ||||
| let a3 = <So> <Much> <Nesting /> </Much> </So>; | ||||
|  | ||||
| let a4 = | ||||
|   <Sibling> | ||||
|     <One test=true foo=b /> | ||||
|     <Two foo=b /> | ||||
|   </Sibling>; | ||||
|  | ||||
| let a5 = <Foo> "testing a string here" </Foo>; | ||||
|  | ||||
| let a6 = | ||||
|   <Foo2> | ||||
|     <Text> "testing a string here" </Text> | ||||
|     <Test yo=1 /> | ||||
|     <Text> "another string" </Text> | ||||
|     <Bar /> | ||||
|     <Exp> (2 + 4) </Exp> | ||||
|   </Foo2>; | ||||
|  | ||||
| let intended = true; | ||||
|  | ||||
| let punning = <Pun intended />; | ||||
|  | ||||
| let namespace = <Namespace.Foo />; | ||||
|  | ||||
| let c = <Foo />; | ||||
|  | ||||
| let d = <Foo />; | ||||
|  | ||||
| let spaceBefore = | ||||
|   <So> <Much> <Nesting /> </Much> </So>; | ||||
|  | ||||
| let spaceBefore2 = <So> <Much /> </So>; | ||||
|  | ||||
| let siblingNotSpaced = | ||||
|   <So> <Much /> <Much /> </So>; | ||||
|  | ||||
| let jsxInList = [<Foo />]; | ||||
|  | ||||
| let jsxInList2 = [<Foo />]; | ||||
|  | ||||
| let jsxInListA = [<Foo />]; | ||||
|  | ||||
| let jsxInListB = [<Foo />]; | ||||
|  | ||||
| let jsxInListC = [<Foo />]; | ||||
|  | ||||
| let jsxInListD = [<Foo />]; | ||||
|  | ||||
| let jsxInList3 = [<Foo />, <Foo />, <Foo />]; | ||||
|  | ||||
| let jsxInList4 = [<Foo />, <Foo />, <Foo />]; | ||||
|  | ||||
| let jsxInList5 = [<Foo />, <Foo />]; | ||||
|  | ||||
| let jsxInList6 = [<Foo />, <Foo />]; | ||||
|  | ||||
| let jsxInList7 = [<Foo />, <Foo />]; | ||||
|  | ||||
| let jsxInList8 = [<Foo />, <Foo />]; | ||||
|  | ||||
| let testFunc b => b; | ||||
|  | ||||
| let jsxInFnCall = testFunc <Foo />; | ||||
|  | ||||
| let lotsOfArguments = | ||||
|   <LotsOfArguments | ||||
|     argument1=1 | ||||
|     argument2=2 | ||||
|     argument3=3 | ||||
|     argument4=4 | ||||
|     argument5=5 | ||||
|     argument6="test"> | ||||
|     <Namespace.Foo /> | ||||
|   </LotsOfArguments>; | ||||
|  | ||||
| let lowerCase = <div argument1=1 />; | ||||
|  | ||||
| let b = 0; | ||||
|  | ||||
| let d = 0; | ||||
|  | ||||
| /* | ||||
|  * Should pun the first example: | ||||
|  */ | ||||
| let a = <Foo a> 5 </Foo>; | ||||
|  | ||||
| let a = <Foo a=b> 5 </Foo>; | ||||
|  | ||||
| let a = <Foo a=b b=d> 5 </Foo>; | ||||
|  | ||||
| let a = <Foo a> 0.55 </Foo>; | ||||
|  | ||||
| let a = Foo.createElement "" [@JSX]; | ||||
|  | ||||
| let ident = <Foo> a </Foo>; | ||||
|  | ||||
| let fragment1 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment2 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment3 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment4 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment5 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment6 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment7 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment8 = <> <Foo /> <Foo /> </>; | ||||
|  | ||||
| let fragment9 = <> 2 2 2 2 </>; | ||||
|  | ||||
| let fragment10 = <> 2.2 3.2 4.6 1.2 </>; | ||||
|  | ||||
| let fragment11 = <> "str" </>; | ||||
|  | ||||
| let fragment12 = <> (6 + 2) (6 + 2) (6 + 2) </>; | ||||
|  | ||||
| let fragment13 = <> fragment11 fragment11 </>; | ||||
|  | ||||
| let listOfItems1 = <List1> 1 2 3 4 5 </List1>; | ||||
|  | ||||
| let listOfItems2 = | ||||
|   <List2> 1.0 2.8 3.8 4.0 5.1 </List2>; | ||||
|  | ||||
| let listOfItems3 = | ||||
|   <List3> fragment11 fragment11 </List3>; | ||||
|  | ||||
| /* | ||||
|  * Several sequential simple jsx expressions must be separated with a space. | ||||
|  */ | ||||
| let thisIsRight a b => (); | ||||
|  | ||||
| let tagOne children => (); | ||||
|  | ||||
| let tagTwo children => (); | ||||
|  | ||||
| /* thisIsWrong <tagOne /><tagTwo />; */ | ||||
| thisIsRight <tagOne /> <tagTwo />; | ||||
|  | ||||
| /* thisIsWrong <tagOne> </tagOne><tagTwo> </tagTwo>; */ | ||||
| thisIsRight <tagOne /> <tagTwo />; | ||||
|  | ||||
| let a children => (); | ||||
|  | ||||
| let b children => (); | ||||
|  | ||||
| let thisIsOkay = | ||||
|   <List1> <a /> <b /> <a /> <b /> </List1>; | ||||
|  | ||||
| let thisIsAlsoOkay = | ||||
|   <List1> <a /> <b /> </List1>; | ||||
|  | ||||
| /* Doesn't make any sense, but suppose you defined an | ||||
|    infix operator to compare jsx */ | ||||
| <a /> < <b />; | ||||
|  | ||||
| <a /> > <b />; | ||||
|  | ||||
| <a /> < <b />; | ||||
|  | ||||
| <a /> > <b />; | ||||
|  | ||||
| let listOfListOfJsx = [<> </>]; | ||||
|  | ||||
| let listOfListOfJsx = [<> <Foo /> </>]; | ||||
|  | ||||
| let listOfListOfJsx = [ | ||||
|   <> <Foo /> </>, | ||||
|   <> <Bar /> </> | ||||
| ]; | ||||
|  | ||||
| let listOfListOfJsx = [ | ||||
|   <> <Foo /> </>, | ||||
|   <> <Bar /> </>, | ||||
|   ...listOfListOfJsx | ||||
| ]; | ||||
|  | ||||
| let sameButWithSpaces = [<> </>]; | ||||
|  | ||||
| let sameButWithSpaces = [<> <Foo /> </>]; | ||||
|  | ||||
| let sameButWithSpaces = [ | ||||
|   <> <Foo /> </>, | ||||
|   <> <Bar /> </> | ||||
| ]; | ||||
|  | ||||
| let sameButWithSpaces = [ | ||||
|   <> <Foo /> </>, | ||||
|   <> <Bar /> </>, | ||||
|   ...sameButWithSpaces | ||||
| ]; | ||||
|  | ||||
| /* | ||||
|  * Test named tag right next to an open bracket. | ||||
|  */ | ||||
| let listOfJsx = []; | ||||
|  | ||||
| let listOfJsx = [<Foo />]; | ||||
|  | ||||
| let listOfJsx = [<Foo />, <Bar />]; | ||||
|  | ||||
| let listOfJsx = [<Foo />, <Bar />, ...listOfJsx]; | ||||
|  | ||||
| let sameButWithSpaces = []; | ||||
|  | ||||
| let sameButWithSpaces = [<Foo />]; | ||||
|  | ||||
| let sameButWithSpaces = [<Foo />, <Bar />]; | ||||
|  | ||||
| let sameButWithSpaces = [ | ||||
|   <Foo />, | ||||
|   <Bar />, | ||||
|   ...sameButWithSpaces | ||||
| ]; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Test no conflict with polymorphic variant types. | ||||
|  */ | ||||
| type thisType = [ | `Foo | `Bar]; | ||||
|  | ||||
| type t 'a = [< thisType] as 'a; | ||||
|  | ||||
| let asd = | ||||
|   <One test=true foo=2> "a" "b" </One> [@foo]; | ||||
|  | ||||
| let asd2 = | ||||
|   One.createElementobvioustypo | ||||
|   test::false | ||||
|   ["a", "b"] | ||||
|   [@JSX] | ||||
|   [@foo]; | ||||
|  | ||||
| let span | ||||
|     test::(test: bool) | ||||
|     foo::(foo: int) | ||||
|     children => 1; | ||||
|  | ||||
| let asd = | ||||
|   <span test=true foo=2> "a" "b" </span> [@foo]; | ||||
|  | ||||
| /* "video" call doesn't end with a list, so the expression isn't converted to JSX */ | ||||
| let video test::(test: bool) children => children; | ||||
|  | ||||
| let asd2 = video test::false 10 [@JSX] [@foo]; | ||||
|  | ||||
| let div children => 1; | ||||
|  | ||||
| ((fun () => div) ()) [] [@JSX]; | ||||
|  | ||||
| let myFun () => | ||||
|   <> | ||||
|     <Namespace.Foo | ||||
|       intended=true | ||||
|       anotherOptional=200 | ||||
|     /> | ||||
|     <Namespace.Foo | ||||
|       intended=true | ||||
|       anotherOptional=200 | ||||
|     /> | ||||
|     <Namespace.Foo | ||||
|       intended=true anotherOptional=200> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|     </Namespace.Foo> | ||||
|   </>; | ||||
|  | ||||
| let myFun () => <> </>; | ||||
|  | ||||
| let myFun () => | ||||
|   <> | ||||
|     <Namespace.Foo | ||||
|       intended=true | ||||
|       anotherOptional=200 | ||||
|     /> | ||||
|     <Namespace.Foo | ||||
|       intended=true | ||||
|       anotherOptional=200 | ||||
|     /> | ||||
|     <Namespace.Foo | ||||
|       intended=true anotherOptional=200> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|       <Foo /> | ||||
|     </Namespace.Foo> | ||||
|   </>; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Children should wrap without forcing attributes to. | ||||
|  */ | ||||
| <Foo a=10 b=0> | ||||
|   <Bar /> | ||||
|   <Bar /> | ||||
|   <Bar /> | ||||
|   <Bar /> | ||||
| </Foo>; | ||||
| /** | ||||
|  * Failing test cases: | ||||
|  */ | ||||
| /* let res = <Foo a=10 b=(<Foo a=200 />) > */ | ||||
| /*   <Bar /> */ | ||||
| /* </Foo>; */ | ||||
| /* let res = <Foo a=10 b=(<Foo a=200 />) />; */ | ||||
							
								
								
									
										1326
									
								
								samples/Reason/Layout.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1326
									
								
								samples/Reason/Layout.re
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										344
									
								
								samples/Reason/Machine.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								samples/Reason/Machine.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | ||||
| open Format; | ||||
|  | ||||
| let module Endo = { | ||||
|   type t 'a = 'a => 'a; | ||||
| }; | ||||
|  | ||||
| let module Syntax = { | ||||
|   let module Var = { | ||||
|     type t = int; | ||||
|   }; | ||||
|   let module Term = { | ||||
|     type t = | ||||
|       | App t t | ||||
|       | Lam t | ||||
|       | Var Var.t | ||||
|       ; | ||||
|   }; | ||||
|   let module Sub = { | ||||
|     type t 'a = | ||||
|       | Cmp (t 'a) (t 'a) | ||||
|       | Dot 'a (t 'a) | ||||
|       | Id | ||||
|       | Shift | ||||
|       ; | ||||
|  | ||||
|     let map f sgm => { | ||||
|       let rec go = fun | ||||
|       | Cmp sgm0 sgm1 => Cmp (go sgm0) (go sgm1) | ||||
|       | Dot a sgm => Dot (f a) (go sgm) | ||||
|       | Id => Id | ||||
|       | Shift => Shift | ||||
|       ; | ||||
|       go sgm; | ||||
|     }; | ||||
|  | ||||
|     let rec apply sgm e => | ||||
|       switch (sgm, e) { | ||||
|       | (sgm, Term.App e0 e1) => Term.App (apply sgm e0) (apply sgm e1) | ||||
|       | (sgm, Term.Lam e) => Term.Lam (apply (Dot (Term.Var 0) (Cmp sgm Shift)) e) | ||||
|       | (Dot e _, Term.Var 0) => e | ||||
|       | (Dot _ sgm, Term.Var i) => apply sgm (Term.Var (i - 1)) | ||||
|       | (Id, Term.Var i) => Term.Var i | ||||
|       | (Shift, Term.Var i) => Term.Var (i + 1) | ||||
|       | (Cmp rho sgm, e) => apply sgm (apply rho e) | ||||
|       }; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Zip = { | ||||
|   open Syntax; | ||||
|   type t 'a = | ||||
|     | App0 (t 'a) 'a | ||||
|     | App1 'a (t 'a) | ||||
|     | Halt | ||||
|     | Lam (t 'a) | ||||
|     ; | ||||
|  | ||||
|   let map f sgm => { | ||||
|     let rec go = fun | ||||
|     | App0 zip e1 => App0 (go zip) (f e1) | ||||
|     | App1 e0 zip => App1 (f e0) (go zip) | ||||
|     | Halt => Halt | ||||
|     | Lam zip => Lam (go zip) | ||||
|     ; | ||||
|     go sgm; | ||||
|   }; | ||||
|  | ||||
|   let rec apply zip acc => switch zip { | ||||
|     | App0 zip e1 => apply zip (Term.App acc e1) | ||||
|     | App1 e0 zip => apply zip (Term.App e0 acc) | ||||
|     | Halt => acc | ||||
|     | Lam zip => apply zip (Term.Lam acc) | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Clo = { | ||||
|   open Syntax; | ||||
|   type t = | ||||
|     | Clo Term.t (Sub.t t); | ||||
|   let rec from (Clo term sgm) => Sub.apply (Sub.map from sgm) term; | ||||
| }; | ||||
|  | ||||
| let module Pretty = { | ||||
|   let module Delim = { | ||||
|     type t = string; | ||||
|     let pp prev next fmt token => if (prev < next) { fprintf fmt "%s" token }; | ||||
|   }; | ||||
|   let module Prec = { | ||||
|     type t = int; | ||||
|     open Syntax.Term; | ||||
|     let calc = fun | ||||
|       | App _ _ => 1 | ||||
|       | Lam _ => 2 | ||||
|       | Var _ => 0 | ||||
|       ; | ||||
|   }; | ||||
|   let module Name = { | ||||
|     type t = string; | ||||
|  | ||||
|     let suffix = { | ||||
|       let script = fun | ||||
|         | 0 => "₀" | ||||
|         | 1 => "₁" | ||||
|         | 2 => "₂" | ||||
|         | 3 => "₃" | ||||
|         | 4 => "₄" | ||||
|         | 5 => "₅" | ||||
|         | 6 => "₆" | ||||
|         | 7 => "₇" | ||||
|         | 8 => "₈" | ||||
|         | 9 => "₉" | ||||
|         | _ => failwith "bad subscript"; | ||||
|       let rec go acc => fun | ||||
|         | 0 => acc | ||||
|         | n => go (script (n mod 10) ^ acc) (n / 10); | ||||
|       go "" | ||||
|     }; | ||||
|  | ||||
|     let gen = { | ||||
|       let offset = 97; | ||||
|       let width = 26; | ||||
|       fun () i => { | ||||
|         let code = i mod width + offset; | ||||
|         let char = Char.chr code; | ||||
|         let prime = i / width; | ||||
|         let suffix = suffix prime; | ||||
|         let name = Char.escaped char ^ suffix; | ||||
|         Some name; | ||||
|       } | ||||
|     }; | ||||
|   }; | ||||
|  | ||||
|   let module Env = { | ||||
|     type t = { | ||||
|       used: list Name.t, | ||||
|       rest: Stream.t Name.t, | ||||
|     }; | ||||
|     let mk () => { | ||||
|       let used = []; | ||||
|       let rest = Stream.from @@ Name.gen (); | ||||
|       { used, rest }; | ||||
|     }; | ||||
|   }; | ||||
|  | ||||
|   type printer 'a = Env.t => Prec.t => formatter => 'a => unit; | ||||
|  | ||||
|   let module Term = { | ||||
|     open Syntax.Term; | ||||
|     let rec pp ({ Env.used: used, rest } as env) prev fmt e => { | ||||
|       let next = Prec.calc e; | ||||
|       switch e { | ||||
|       | App e0 e1 => | ||||
|         fprintf fmt "@[%a%a@ %a%a@]" | ||||
|           (Delim.pp prev next) "(" | ||||
|           (pp env 1) e0 | ||||
|           (pp env 0) e1 | ||||
|           (Delim.pp prev next) ")" | ||||
|       | Lam e => | ||||
|         let name = Stream.next rest; | ||||
|         let env = { ...env, Env.used: [name, ...used] }; | ||||
|         fprintf fmt "%aλ%a.%a%a" | ||||
|           (Delim.pp prev next) "(" | ||||
|           (pp_print_string) name | ||||
|           (pp env next) e | ||||
|           (Delim.pp prev next) ")" | ||||
|       | Var index => | ||||
|         fprintf fmt "%s" @@ try (List.nth used index) { | ||||
|           | _ => "#" ^ string_of_int index | ||||
|           } | ||||
|       } | ||||
|     }; | ||||
|   }; | ||||
|  | ||||
|   let module Sub = { | ||||
|     open Syntax.Sub; | ||||
|     let rec pp pp_elem env prev fmt => fun | ||||
|     | Cmp sgm1 sgm0 => | ||||
|       fprintf fmt "@[%a;@ %a@]" | ||||
|         (pp pp_elem env prev) sgm1 | ||||
|         (pp pp_elem env prev) sgm0 | ||||
|     | Dot e sgm => | ||||
|       fprintf fmt "@[%a@ ·@ %a@]" | ||||
|         (pp_elem env prev) e | ||||
|         (pp pp_elem env prev) sgm | ||||
|     | Id => | ||||
|       fprintf fmt "ι" | ||||
|     | Shift => | ||||
|       fprintf fmt "↑" | ||||
|     ; | ||||
|   }; | ||||
|  | ||||
|   let module Clo = { | ||||
|     let rec pp env prev fmt (Clo.Clo e sgm) => { | ||||
|       let next = Prec.calc e; | ||||
|       fprintf fmt "@[%a%a%a[%a]@]" | ||||
|         (Delim.pp prev next) "(" | ||||
|         (Term.pp env next) e | ||||
|         (Delim.pp prev next) ")" | ||||
|         (Sub.pp pp env next) sgm | ||||
|     }; | ||||
|   }; | ||||
|  | ||||
|   let module Zip = { | ||||
|     open Zip; | ||||
|     let rec pp pp_elem env prev fmt => fun | ||||
|     | App0 zip elem => | ||||
|       fprintf fmt "inl@[<v -1>⟨@,%a@,%a⟩@]" | ||||
|         (pp pp_elem env prev) zip | ||||
|         (pp_elem env prev) elem | ||||
|     | App1 elem zip => | ||||
|       fprintf fmt "inr@[<v -1>⟨@,%a@,%a⟩@]" | ||||
|         (pp_elem env prev) elem | ||||
|         (pp pp_elem env prev) zip | ||||
|     | Halt => | ||||
|       fprintf fmt "halt" | ||||
|     | Lam zip => | ||||
|       fprintf fmt "lam@[<v -1>⟨@,%a⟩@]" | ||||
|         (pp pp_elem env prev) zip | ||||
|     ; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Machine = { | ||||
|   type t = { | ||||
|     clo: Clo.t, | ||||
|     ctx: Zip.t Clo.t, | ||||
|   }; | ||||
|  | ||||
|   let into e => { | ||||
|     open Clo; | ||||
|     open Syntax.Sub; | ||||
|     let clo = Clo e Id; | ||||
|     let ctx = Zip.Halt; | ||||
|     { clo, ctx } | ||||
|   }; | ||||
|  | ||||
|   let from { clo, ctx } => Zip.apply (Zip.map Clo.from ctx) (Clo.from clo); | ||||
|  | ||||
|   let pp fmt rule state => { | ||||
|     fprintf fmt "@[<v>ctx  ::@[<v -5>@,%a@]@,clo  ::@[<v -5>@,%a@]@,rule ::@[<v -5>@,%a@]@,term ::@[<v -5>@,%a@]@]@." | ||||
|       (Pretty.Zip.pp Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.ctx | ||||
|                     (Pretty.Clo.pp (Pretty.Env.mk ()) 2) state.clo | ||||
|                                        (pp_print_string) rule | ||||
|                    (Pretty.Term.pp (Pretty.Env.mk ()) 2) (from state) | ||||
|   }; | ||||
|  | ||||
|   let halted state => { | ||||
|     open Clo; | ||||
|     open Syntax.Sub; | ||||
|     open Syntax.Term; | ||||
|     switch state { | ||||
|     | { clo: Clo (Var _) Id, _ } => true | ||||
|     | _ => false | ||||
|     } [@warning "-4"]; | ||||
|   }; | ||||
|  | ||||
|   let step state => { | ||||
|     open Clo; | ||||
|     open Syntax.Sub; | ||||
|     open Syntax.Term; | ||||
|     let rule = ref ""; | ||||
|     let state = switch state { | ||||
|     /* left */ | ||||
|     | { clo: Clo (App e0 e1) sgm, ctx } => | ||||
|       let clo = Clo e0 sgm; | ||||
|       let ctx = Zip.App0 ctx (Clo e1 sgm); | ||||
|       rule := "LEFT"; | ||||
|       { clo, ctx }; | ||||
|     /* beta */ | ||||
|     | { clo: Clo (Lam e) sgm, ctx: Zip.App0 ctx c0 } => | ||||
|       let clo = Clo e (Cmp (Dot c0 sgm) Id); | ||||
|       rule := "BETA"; | ||||
|       { clo, ctx }; | ||||
|     /* lambda */ | ||||
|     | { clo: Clo (Lam e) sgm, ctx } => | ||||
|       let clo = Clo e (Cmp (Dot (Clo (Var 0) Id) (Cmp sgm Shift)) Id); | ||||
|       let ctx = Zip.Lam ctx; | ||||
|       rule := "LAMBDA"; | ||||
|       { clo, ctx }; | ||||
|     /* associate */ | ||||
|     | { clo: Clo (Var n) (Cmp (Cmp pi rho) sgm), ctx } => | ||||
|       let clo = Clo (Var n) (Cmp pi (Cmp rho sgm)); | ||||
|       rule := "ASSOCIATE"; | ||||
|       { clo, ctx }; | ||||
|     /* head */ | ||||
|     | { clo: Clo (Var 0) (Cmp (Dot (Clo e pi) _) sgm), ctx } => | ||||
|       let clo = Clo e (Cmp pi sgm); | ||||
|       rule := "HEAD"; | ||||
|       { clo, ctx }; | ||||
|     /* tail */ | ||||
|     | { clo: Clo (Var n) (Cmp (Dot (Clo _ _) rho) sgm), ctx } => | ||||
|       let clo = Clo (Var (n - 1)) (Cmp rho sgm); | ||||
|       rule := "TAIL"; | ||||
|       { clo, ctx }; | ||||
|     /* shift */ | ||||
|     | { clo: Clo (Var n) (Cmp Shift sgm), ctx } => | ||||
|       let clo = Clo (Var (n + 1)) sgm; | ||||
|       rule := "SHIFT"; | ||||
|       { clo, ctx }; | ||||
|     /* id */ | ||||
|     | { clo: Clo (Var n) (Cmp Id sgm), ctx } => | ||||
|       let clo = Clo (Var n) sgm; | ||||
|       rule := "ID"; | ||||
|       { clo, ctx }; | ||||
|     | _ => | ||||
|       pp std_formatter !rule state; | ||||
|       failwith "bad state"; | ||||
|     } [@warning "-4"]; | ||||
|     pp std_formatter !rule state; | ||||
|     state; | ||||
|   }; | ||||
|  | ||||
|   let norm e => { | ||||
|     let count = ref 0; | ||||
|     let state = ref (into e); | ||||
|     while (not (halted !state)) { | ||||
|       fprintf std_formatter "@\n--- step[%d] ---@\n" !count; | ||||
|       incr count; | ||||
|       state := step !state; | ||||
|     }; | ||||
|     from !state; | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| let module Test = { | ||||
|   open Syntax.Term; | ||||
|   let l e => Lam e; | ||||
|   let ( *@ ) e0 e1 => App e0 e1; | ||||
|   let ff = l (l (Var 1)); | ||||
|   let tt = l (l (Var 0)); | ||||
|   let zero = l (l (Var 1)); | ||||
|   let succ = l (l (l (Var 0 *@ Var 2))); | ||||
|   let one = succ *@ zero; | ||||
|   let two = succ *@ one; | ||||
|   let three = succ *@ two; | ||||
|   let const = l (l (Var 1)); | ||||
|   let fix = l (l (Var 1 *@ (Var 0 *@ Var 0)) *@ l (Var 1 *@ (Var 0 *@ Var 0))); | ||||
|   let add = fix *@ l (l (l (Var 1 *@ Var 0 *@ l (succ *@ Var 3 *@ Var 0 *@ Var 1)))); | ||||
|   let init = l (l (Var 0) *@ l (l (Var 1))); | ||||
| }; | ||||
|  | ||||
| let module Run = { | ||||
|   let go () => Machine.norm Test.init; | ||||
| }; | ||||
							
								
								
									
										308
									
								
								samples/Reason/SuperMerlin.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								samples/Reason/SuperMerlin.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| /* | ||||
|  * Copyright (c) 2015-present, Facebook, Inc. | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  */ | ||||
| let startedMerlin: ref (option Js.Unsafe.any) = {contents: None}; | ||||
|  | ||||
| let fixedEnv = Js.Unsafe.js_expr "require('../lib/fixedEnv')"; | ||||
|  | ||||
| /* This and the subsequent big js blocks are copied over from Nuclide. More convenient for now. */ | ||||
| let findNearestMerlinFile' = Js.Unsafe.js_expr {| | ||||
|   function findNearestMerlinFile(beginAtFilePath) { | ||||
|     var path = require('path'); | ||||
|     var fs = require('fs'); | ||||
|     var fileDir = path.dirname(beginAtFilePath); | ||||
|     var currentPath = path.resolve(fileDir); | ||||
|     do { | ||||
|       var fileToFind = path.join(currentPath, '.merlin'); | ||||
|       var hasFile = fs.existsSync(fileToFind); | ||||
|       if (hasFile) { | ||||
|         return path.dirname(currentPath); | ||||
|       } | ||||
|  | ||||
|       if (path.dirname(currentPath) === currentPath) { | ||||
|         // Bail | ||||
|         return '.'; | ||||
|       } | ||||
|       currentPath = path.dirname(currentPath); | ||||
|     } while (true); | ||||
|   } | ||||
| |}; | ||||
|  | ||||
| let findNearestMerlinFile beginAtFilePath::path => { | ||||
|   let result = Js.Unsafe.fun_call findNearestMerlinFile' [|Js.Unsafe.inject (Js.string path)|]; | ||||
|   Js.to_string result | ||||
| }; | ||||
|  | ||||
| let createMerlinReaderFnOnce' = Js.Unsafe.js_expr {| | ||||
|   function(ocamlMerlinPath, ocamlMerlinFlags, dotMerlinDir, fixedEnv) { | ||||
|     var spawn = require('child_process').spawn; | ||||
|     // To split while stripping out any leading/trailing space, we match on all | ||||
|     // *non*-whitespace. | ||||
|     var items = ocamlMerlinFlags === '' ? [] : ocamlMerlinFlags.split(/\s+/); | ||||
|     var merlinProcess = spawn(ocamlMerlinPath, items, {cwd: dotMerlinDir}); | ||||
|     merlinProcess.stderr.on('data', function(d) { | ||||
|       console.error('Ocamlmerlin: something wrong happened:'); | ||||
|       console.error(d.toString()); | ||||
|     }); | ||||
|  | ||||
|     merlinProcess.stdout.on('close', function(d) { | ||||
|       console.error('Ocamlmerlin: closed.'); | ||||
|     }); | ||||
|  | ||||
|     var cmdQueue = []; | ||||
|     var hasStartedReading = false; | ||||
|  | ||||
|     var readline = require('readline'); | ||||
|     var reader = readline.createInterface({ | ||||
|       input: merlinProcess.stdout, | ||||
|       terminal: false, | ||||
|     }); | ||||
|  | ||||
|     return function(cmd, resolve, reject) { | ||||
|       cmdQueue.push([resolve, reject]); | ||||
|  | ||||
|       if (!hasStartedReading) { | ||||
|         hasStartedReading = true; | ||||
|         reader.on('line', function(line) { | ||||
|           var response; | ||||
|           try { | ||||
|             response = JSON.parse(line); | ||||
|           } catch (err) { | ||||
|             response = null; | ||||
|           } | ||||
|           var resolveReject = cmdQueue.shift(); | ||||
|           var resolve = resolveReject[0]; | ||||
|           var reject = resolveReject[1]; | ||||
|  | ||||
|           if (!response || !Array.isArray(response) || response.length !== 2) { | ||||
|             reject(new Error('Unexpected ocamlmerlin output format: ' + line)); | ||||
|             return; | ||||
|           } | ||||
|  | ||||
|           var status = response[0]; | ||||
|           var content = response[1]; | ||||
|  | ||||
|           var errorResponses = { | ||||
|             'failure': true, | ||||
|             'error': true, | ||||
|             'exception': true, | ||||
|           }; | ||||
|  | ||||
|           if (errorResponses[status]) { | ||||
|             reject(new Error('Ocamlmerlin returned an error: ' + line)); | ||||
|             return; | ||||
|           } | ||||
|  | ||||
|           resolve(content); | ||||
|         }); | ||||
|       } | ||||
|  | ||||
|       merlinProcess.stdin.write(JSON.stringify(cmd)); | ||||
|     }; | ||||
|   } | ||||
| |}; | ||||
|  | ||||
| let createMerlinReaderFnOnce | ||||
|     pathToMerlin::pathToMerlin | ||||
|     merlinFlags::merlinFlags | ||||
|     dotMerlinPath::dotMerlinPath => | ||||
|   Js.Unsafe.fun_call | ||||
|     createMerlinReaderFnOnce' | ||||
|     [| | ||||
|       Js.Unsafe.inject (Js.string pathToMerlin), | ||||
|       Js.Unsafe.inject (Js.string merlinFlags), | ||||
|       Js.Unsafe.inject (Js.string dotMerlinPath), | ||||
|       Js.Unsafe.inject fixedEnv | ||||
|     |]; | ||||
|  | ||||
| let startMerlinProcess path::path => | ||||
|   switch startedMerlin.contents { | ||||
|   | Some readerFn => () | ||||
|   | None => | ||||
|     let atomReasonPathToMerlin = Atom.Config.get "atom-reason.pathToMerlin"; | ||||
|     let atomReasonMerlinFlags = Atom.Config.get "atom-reason.merlinFlags"; | ||||
|     let atomReasonMerlinLogFile = Atom.Config.get "atom-reason.merlinLogFile"; | ||||
|     switch atomReasonMerlinLogFile { | ||||
|     | JsonString "" => () | ||||
|     | JsonString s => Atom.Env.setEnvVar "MERLIN_LOG" s | ||||
|     | _ => () | ||||
|     }; | ||||
|     let readerFn = | ||||
|       createMerlinReaderFnOnce | ||||
|         pathToMerlin::(Atom.JsonValue.unsafeExtractString atomReasonPathToMerlin) | ||||
|         merlinFlags::(Atom.JsonValue.unsafeExtractString atomReasonMerlinFlags) | ||||
|         dotMerlinPath::(findNearestMerlinFile beginAtFilePath::path); | ||||
|     startedMerlin.contents = Some readerFn | ||||
|   }; | ||||
|  | ||||
| let readOneLine cmd::cmd resolve reject => | ||||
|   switch startedMerlin.contents { | ||||
|   | None => raise Not_found | ||||
|   | Some readerFn => | ||||
|     Js.Unsafe.fun_call | ||||
|       readerFn | ||||
|       [| | ||||
|         Js.Unsafe.inject cmd, | ||||
|         Js.Unsafe.inject (Js.wrap_callback resolve), | ||||
|         Js.Unsafe.inject (Js.wrap_callback reject) | ||||
|       |] | ||||
|   }; | ||||
|  | ||||
| /* contextify is important for avoiding different buffers calling the backing merlin at the same time. */ | ||||
| /* https://github.com/the-lambda-church/merlin/blob/d98a08d318ca14d9c702bbd6eeadbb762d325ce7/doc/dev/PROTOCOL.md#contextual-commands */ | ||||
| let contextify query::query path::path => Js.Unsafe.obj [| | ||||
|   ("query", Js.Unsafe.inject query), | ||||
|   ("context", Js.Unsafe.inject (Js.array [|Js.string "auto", Js.string path|])) | ||||
| |]; | ||||
|  | ||||
| let prepareCommand text::text path::path query::query resolve reject => { | ||||
|   startMerlinProcess path; | ||||
|   /* These two commands should be run before every main command. */ | ||||
|   readOneLine | ||||
|     cmd::( | ||||
|       contextify | ||||
|         /* The protocol command tells Merlin which API version we want to use. (2 for us) */ | ||||
|         query::( | ||||
|           Js.array [| | ||||
|             Js.Unsafe.inject (Js.string "protocol"), | ||||
|             Js.Unsafe.inject (Js.string "version"), | ||||
|             Js.Unsafe.inject (Js.number_of_float 2.) | ||||
|           |] | ||||
|         ) | ||||
|         path::path | ||||
|     ) | ||||
|     ( | ||||
|       fun _ => | ||||
|         readOneLine | ||||
|           cmd::( | ||||
|             contextify | ||||
|               /* The tell command allows us to synchronize our text with Merlin's internal buffer. */ | ||||
|               query::( | ||||
|                 Js.array [|Js.string "tell", Js.string "start", Js.string "end", Js.string text|] | ||||
|               ) | ||||
|               path::path | ||||
|           ) | ||||
|           (fun _ => readOneLine cmd::(contextify query::query path::path) resolve reject) | ||||
|           reject | ||||
|     ) | ||||
|     reject | ||||
| }; | ||||
|  | ||||
| let positionToJsMerlinPosition (line, col) => Js.Unsafe.obj [| | ||||
|   /* lines (rows) are 1-based for merlin, not 0-based, like for Atom */ | ||||
|   ("line", Js.Unsafe.inject (Js.number_of_float (float_of_int (line + 1)))), | ||||
|   ("col", Js.Unsafe.inject (Js.number_of_float (float_of_int col))) | ||||
| |]; | ||||
|  | ||||
| /* Actual merlin commands we'll use. */ | ||||
| let getTypeHint path::path text::text position::position resolve reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::( | ||||
|       Js.array [| | ||||
|         Js.Unsafe.inject (Js.string "type"), | ||||
|         Js.Unsafe.inject (Js.string "enclosing"), | ||||
|         Js.Unsafe.inject (Js.string "at"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition position) | ||||
|       |] | ||||
|     ) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| let getAutoCompleteSuggestions | ||||
|     path::path | ||||
|     text::text | ||||
|     position::position | ||||
|     prefix::prefix | ||||
|     resolve | ||||
|     reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::( | ||||
|       Js.array [| | ||||
|         Js.Unsafe.inject (Js.string "complete"), | ||||
|         Js.Unsafe.inject (Js.string "prefix"), | ||||
|         Js.Unsafe.inject (Js.string prefix), | ||||
|         Js.Unsafe.inject (Js.string "at"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition position), | ||||
|         Js.Unsafe.inject (Js.string "with"), | ||||
|         Js.Unsafe.inject (Js.string "doc") | ||||
|       |] | ||||
|     ) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| let getDiagnostics path::path text::text resolve reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::(Js.array [|Js.Unsafe.inject (Js.string "errors")|]) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| let locate path::path text::text extension::extension position::position resolve reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::( | ||||
|       Js.array [| | ||||
|         Js.Unsafe.inject (Js.string "locate"), | ||||
|         Js.Unsafe.inject (Js.string ""), | ||||
|         Js.Unsafe.inject (Js.string extension), | ||||
|         Js.Unsafe.inject (Js.string "at"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition position) | ||||
|       |] | ||||
|     ) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| /* reject */ | ||||
| let getOccurrences path::path text::text position::position resolve reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::( | ||||
|       Js.array [| | ||||
|         Js.Unsafe.inject (Js.string "occurrences"), | ||||
|         Js.Unsafe.inject (Js.string "ident"), | ||||
|         Js.Unsafe.inject (Js.string "at"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition position) | ||||
|       |] | ||||
|     ) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| let destruct | ||||
|     path::path | ||||
|     text::text | ||||
|     startPosition::startPosition | ||||
|     endPosition::endPosition | ||||
|     resolve | ||||
|     reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::( | ||||
|       Js.array [| | ||||
|         Js.Unsafe.inject (Js.string "case"), | ||||
|         Js.Unsafe.inject (Js.string "analysis"), | ||||
|         Js.Unsafe.inject (Js.string "from"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition startPosition), | ||||
|         Js.Unsafe.inject (Js.string "to"), | ||||
|         Js.Unsafe.inject (positionToJsMerlinPosition endPosition) | ||||
|       |] | ||||
|     ) | ||||
|     resolve | ||||
|     reject; | ||||
|  | ||||
| let getOutline path::path text::text resolve reject => | ||||
|   prepareCommand | ||||
|     text::text | ||||
|     path::path | ||||
|     query::(Js.array [|Js.Unsafe.inject (Js.string "outline")|]) | ||||
|     resolve | ||||
|     reject; | ||||
							
								
								
									
										989
									
								
								samples/Reason/Syntax.re
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										989
									
								
								samples/Reason/Syntax.re
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,989 @@ | ||||
| /* Copyright (c) 2015-present, Facebook, Inc. All rights reserved. */ | ||||
| [@@@autoFormat let wrap = 80; let shift = 2]; | ||||
|  | ||||
| Modules.run (); | ||||
|  | ||||
| Polymorphism.run (); | ||||
|  | ||||
| Variants.run (); | ||||
|  | ||||
| BasicStructures.run (); | ||||
|  | ||||
| TestUtils.printSection "General Syntax"; | ||||
|  | ||||
| /* Won't work! */ | ||||
| /* let matchingFunc a = match a with */ | ||||
| /*   `Thingy x => (print_string "matched thingy x"); x */ | ||||
| /*   | `Other x => (print_string "matched other x"); x;; */ | ||||
| /*  */ | ||||
| let matchingFunc a => | ||||
|   switch a { | ||||
|   | `Thingy x => | ||||
|     print_string "matched thingy x"; | ||||
|     let zz = 10; | ||||
|     zz | ||||
|   | `Other x => | ||||
|     print_string "matched other x"; | ||||
|     x | ||||
|   }; | ||||
|  | ||||
| type firstTwoShouldBeGroupedInParens = | ||||
|   (int => int) => int => int; | ||||
|  | ||||
| type allParensCanBeRemoved = | ||||
|   int => int => int => int; | ||||
|  | ||||
| type firstTwoShouldBeGroupedAndFirstThree = | ||||
|   ((int => int) => int) => int; | ||||
|  | ||||
| /* Same thing now but with type constructors instead of each int */ | ||||
| type firstTwoShouldBeGroupedInParens = | ||||
|   (list int => list int) => list int => list int; | ||||
|  | ||||
| type allParensCanBeRemoved = | ||||
|   list int => list int => list int => list int; | ||||
|  | ||||
| type firstTwoShouldBeGroupedAndFirstThree = | ||||
|   ((list int => list int) => list int) => | ||||
|   list int; | ||||
|  | ||||
| type myRecordType = { | ||||
|   firstTwoShouldBeGroupedInParens: | ||||
|     (int => int) => int => int, | ||||
|   allParensCanBeRemoved: | ||||
|     int => int => int => int, | ||||
|   firstTwoShouldBeGroupedAndFirstThree: | ||||
|     ((int => int) => int) => int | ||||
| }; | ||||
|  | ||||
| type firstNamedArgShouldBeGroupedInParens = | ||||
|   first::(int => int) => second::int => int; | ||||
|  | ||||
| type allParensCanBeRemoved = | ||||
|   first::int => second::int => third::int => int; | ||||
|  | ||||
| type firstTwoShouldBeGroupedAndFirstThree = | ||||
|   first::((int => int) => int) => int; | ||||
|  | ||||
| /* Same thing now, but with type constructors instead of int */ | ||||
| type firstNamedArgShouldBeGroupedInParens = | ||||
|   first::(list int => list int) => | ||||
|   second::list int => | ||||
|   list int; | ||||
|  | ||||
| type allParensCanBeRemoved = | ||||
|   first::list int => | ||||
|   second::list int => | ||||
|   third::list int => | ||||
|   list int; | ||||
|  | ||||
| type firstTwoShouldBeGroupedAndFirstThree = | ||||
|   first::((list int => list int) => list int) => | ||||
|   list int; | ||||
|  | ||||
| type firstNamedArgShouldBeGroupedInParens = | ||||
|   first::(int => int)? => | ||||
|   second::int list? => | ||||
|   int; | ||||
|  | ||||
| /* The arrow necessitates parens around the next two args. The ? isn't what | ||||
|  * makes the parens necessary. */ | ||||
| type firstNamedArgShouldBeGroupedInParensAndSecondNamedArg = | ||||
|   first::(int => int)? => | ||||
|   second::(int => int)? => | ||||
|   int; | ||||
|  | ||||
| type allParensCanBeRemoved = | ||||
|   first::int? => | ||||
|   second::int? => | ||||
|   third::int? => | ||||
|   int; | ||||
|  | ||||
| type firstTwoShouldBeGroupedAndFirstThree = | ||||
|   first::((int => int) => int) => int; | ||||
|  | ||||
| type noParens = | ||||
|   one::int => int => int => two::int => int; | ||||
|  | ||||
| type noParensNeeded = | ||||
|   one::int => int => int => two::int => int; | ||||
|  | ||||
| type firstNamedArgNeedsParens = | ||||
|   one::(int => int => int) => two::int => int; | ||||
|  | ||||
| /* Now, let's try type aliasing */ | ||||
| /* Unless wrapped in parens, types between arrows may not be aliased, may not | ||||
|  * themselves be arrows. */ | ||||
| type parensRequiredAroundFirstArg = | ||||
|   (list int as 'a) => int as 'a; | ||||
|  | ||||
| type parensRequiredAroundReturnType = | ||||
|   (list int as 'a) => (int as 'a); | ||||
|  | ||||
| type parensRequiredAroundReturnType = | ||||
|   (list int as 'a) => (int as 'a) as 'b; | ||||
|  | ||||
| type noParensNeededWhenInTuple = | ||||
|   (list int as 'a, list int as 'b) as 'entireThing; | ||||
|  | ||||
| type myTypeDef 'a = list 'a; | ||||
|  | ||||
| type instatiatedTypeDef = myTypeDef int => int; | ||||
|  | ||||
| /* Test a type attribute for good measure */ | ||||
| /* We should clean up all of the attribute tagging eventually, but for now, | ||||
|  * let's make it super ugly to get out of the way of all the formatting/parsing | ||||
|  * implementations (fewer conflicts during parsing, fewer edge cases during | ||||
|  * printing). | ||||
|  */ | ||||
| type something = ( | ||||
|   int, | ||||
|   int [@lookAtThisAttribute] | ||||
| ); | ||||
|  | ||||
| type longWrappingTypeDefinitionExample = | ||||
|   M_RK__G.Types.instance | ||||
|     (TGRecognizer.tGFields unit unit) | ||||
|     (TGRecognizer.tGMethods unit unit); | ||||
|  | ||||
| type semiLongWrappingTypeDefinitionExample = | ||||
|   M_RK__Gesture.Types.instance | ||||
|     TGRecognizerFinal.tGFields | ||||
|     TGRecognizerFinal.tGMethods; | ||||
|  | ||||
| type semiLongWrappingTypeWithConstraint = | ||||
|   M_RK__Gesture.Types.instance | ||||
|     'a | ||||
|     TGRecognizerFinal.tGFields | ||||
|     TGRecognizerFinal.tGMethods | ||||
| constraint 'a = (unit, unit); | ||||
|  | ||||
| type onelineConstrain = 'a constraint 'a = int; | ||||
|  | ||||
| /* This must be in trunk but not in this branch of OCaml */ | ||||
| /* type withNestedRecords = MyConstructor {myField: int} */ | ||||
| type colors = | ||||
|   | Red int | ||||
|   | Black int | ||||
|   | Green int; | ||||
|  | ||||
| /* Another approach is to require declared variants to wrap any record */ | ||||
| /* type myRecord = MyRecord {name: int}; */ | ||||
| /* let myValue = MyRecord {name: int}; */ | ||||
| /* This would force importing of the module */ | ||||
| /* This would also lend itself naturally to pattern matching - and avoid having | ||||
|    to use `.` operator at all since you normally destructure. */ | ||||
| type nameBlahType = {nameBlah: int}; | ||||
|  | ||||
| let myRecord = {nameBlah: 20}; | ||||
|  | ||||
| let myRecordName = myRecord.nameBlah; | ||||
|  | ||||
| let {nameBlah}: nameBlahType = {nameBlah: 20}; | ||||
|  | ||||
| print_int nameBlah; | ||||
|  | ||||
| let {nameBlah: aliasedToThisVar}: nameBlahType = { | ||||
|   nameBlah: 20 | ||||
| }; | ||||
|  | ||||
| print_int aliasedToThisVar; | ||||
|  | ||||
| let desiredFormattingForWrappedLambda: | ||||
|   int => int => int => nameBlahType = | ||||
|   /* | ||||
|  | ||||
|    fun is | ||||
|    pre-   /firstarg\ | ||||
|    fix   /-coupled--\ | ||||
|     |-\ /-to-prefix--\       */ | ||||
|   fun curriedArg anotherArg lastArg => { | ||||
|     nameBlah: 10 | ||||
|   }; | ||||
|  | ||||
| type longerInt = int; | ||||
|  | ||||
| let desiredFormattingForWrappedLambdaWrappedArrow: | ||||
|   longerInt => | ||||
|   longerInt => | ||||
|   longerInt => | ||||
|   nameBlahType = | ||||
|   /* | ||||
|  | ||||
|    fun is | ||||
|    pre-   /firstarg\ | ||||
|    fix   /-coupled--\ | ||||
|     |-\ /-to-prefix--\       */ | ||||
|   fun curriedArg anotherArg lastArg => { | ||||
|     nameBlah: 10 | ||||
|   }; | ||||
|  | ||||
| let desiredFormattingForWrappedLambdaReturnOnNewLine | ||||
|     /* | ||||
|  | ||||
|      fun is | ||||
|      pre-   /firstarg\ | ||||
|      fix   /-coupled--\ | ||||
|       |-\ /-to-prefix--\       */ | ||||
|     curriedArg | ||||
|     anotherArg | ||||
|     lastArg => { | ||||
|   nameBlah: 10 | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  let is | ||||
|  pre- | ||||
|  fix    /-function binding name---\ | ||||
|  |-\   / is coupled to prefix      \   */ | ||||
| let desiredFormattingForWrappedSugar | ||||
|     curriedArg | ||||
|     anotherArg | ||||
|     lastArg => { | ||||
|   nameBlah: 10 | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  let is | ||||
|  pre- | ||||
|  fix    /-function binding name---\ | ||||
|  |-\   / is coupled to prefix      \   */ | ||||
| let desiredFormattingForWrappedSugarReturnOnNewLine | ||||
|     curriedArg | ||||
|     anotherArg | ||||
|     lastArg => { | ||||
|   nameBlah: 10 | ||||
| }; | ||||
|  | ||||
| /* | ||||
|    let  : type t1 t2. t1 * t2 list -> t1 = ... | ||||
|    let rec f : 't1 't2. 't1 * 't2 list -> 't1 = | ||||
|      fun (type t1) (type t2) -> (... : t1 * t2 list -> t1) | ||||
|  */ | ||||
| type point = {x: int, y: int}; | ||||
|  | ||||
| type point3D = {x: int, y: int, z: int}; | ||||
|  | ||||
| let point2D = {x: 20, y: 30}; | ||||
|  | ||||
| let point3D: point3D = { | ||||
|   x: 10, | ||||
|   y: 11, | ||||
|   z: 80 /* Optional Comma */ | ||||
| }; | ||||
|  | ||||
| let printPoint (p: point) => { | ||||
|   print_int p.x; | ||||
|   print_int p.y | ||||
| }; | ||||
|  | ||||
| let addPoints (p1: point, p2: point) => { | ||||
|   x: p1.x + p2.x, | ||||
|   y: p1.y + p2.y | ||||
| }; | ||||
|  | ||||
| let res1 = printPoint point2D; | ||||
|  | ||||
| let res2 = | ||||
|   printPoint {x: point3D.x, y: point3D.y}; | ||||
|  | ||||
| /* | ||||
|     When () were used to indicate sequences, the parser used seq_expr not only | ||||
|     for grouping sequences, but also to form standard precedences. | ||||
|                           /------- sequence_expr ------\ | ||||
|     let res3 = printPoint (addPoints (point2D, point3D)); | ||||
|  | ||||
|     Interestingly, it knew that tuples aren't sequences. | ||||
|  | ||||
|     To move towards semi delimited, semi-terminated, braces-grouped sequences: | ||||
|     while allowing any non-sequence expression to be grouped on parens, we make | ||||
|     an explicit rule that allows one single non-semi ended expression to be | ||||
|     grouped in parens. | ||||
|  | ||||
|     Actually: We will allow an arbitrary number of semi-delimited expressions to | ||||
|     be wrapped in parens, but the braces grouped semi delimited (sequence) | ||||
|     expressions must *also* be terminated with a semicolon. | ||||
|  | ||||
|     This allows the parser to distinguish between | ||||
|  | ||||
|         let x = {a};    /* Record {a:a} */ | ||||
|         let x = {a;};   /* Single item sequence returning identifier {a} */ | ||||
|  */ | ||||
| let res3 = | ||||
|   printPoint ( | ||||
|     addPoints ( | ||||
|       point2D, | ||||
|       {x: point3D.x, y: point3D.y} | ||||
|     ) | ||||
|   ); | ||||
|  | ||||
| type person = {age: int, name: string}; | ||||
|  | ||||
| type hiredPerson = { | ||||
|   age: string, | ||||
|   name: string, | ||||
|   dateHired: int | ||||
| }; | ||||
|  | ||||
| let o: person = {name: "bob", age: 10}; | ||||
|  | ||||
| /* Parens needed? Nope! */ | ||||
| let o: person = {name: "bob", age: 10}; | ||||
|  | ||||
| let printPerson (p: person) => { | ||||
|   let q: person = p; | ||||
|   p.name ^ p.name | ||||
| }; | ||||
|  | ||||
| /* let dontParseMeBro x y:int = x = y;*/ | ||||
| /* With this unification, anywhere eyou see `= fun` you can just ommit it */ | ||||
| let blah a => a; /* Done */ | ||||
|  | ||||
| let blah a => a; /* Done (almost) */ | ||||
|  | ||||
| let blah a b => a; /* Done */ | ||||
|  | ||||
| let blah a b => a; /* Done (almost) */ | ||||
|  | ||||
| /* More than one consecutive pattern must have a single case */ | ||||
| type blah = {blahBlah: int}; | ||||
|  | ||||
| let blah a {blahBlah} => a; | ||||
|  | ||||
| let blah a {blahBlah} => a; | ||||
|  | ||||
| let module TryToExportTwice = { | ||||
|   let myVal = "hello"; | ||||
| }; | ||||
|  | ||||
| /* | ||||
|    Unifying top level module syntax with local module syntax is probably a bad | ||||
|    idea at the moment because it makes it more difficult to continue to support | ||||
|    `let .. in` bindings. We can distinguish local modules for `let..in` that | ||||
|    just happen to be defined at the top level (but not exported). | ||||
|  | ||||
|      let MyModule = {let myVal = 20;} in | ||||
|      MyModule.x | ||||
|  | ||||
|    Wait, where would this ever be valid, even if we continued to support | ||||
|    `let..in`? | ||||
|  */ | ||||
| let onlyDoingThisTopLevelLetToBypassTopLevelSequence = { | ||||
|   let x = { | ||||
|     print_int 1; | ||||
|     print_int 20 /* Missing trailing SEMI */ | ||||
|   }; | ||||
|   let x = { | ||||
|     print_int 1; | ||||
|     print_int 20; /* Ensure missing middle SEMI reported well */ | ||||
|     print_int 20 | ||||
|   }; | ||||
|   let x = { | ||||
|     print_int 1; | ||||
|     print_int 20; | ||||
|     10 | ||||
|     /* Comment in final position */ | ||||
|   }; /* Missing final SEMI */ | ||||
|   x + x | ||||
| }; | ||||
|  | ||||
| type hasA = {a: int}; | ||||
|  | ||||
| let a = 10; | ||||
|  | ||||
| let returnsASequenceExpressionWithASingleIdentifier | ||||
|     () => a; | ||||
|  | ||||
| let thisReturnsA () => a; | ||||
|  | ||||
| let thisReturnsAAsWell () => a; | ||||
|  | ||||
| let recordVal: int = (thisReturnsARecord ()).a; | ||||
|  | ||||
| Printf.printf | ||||
|   "\nproof that thisReturnsARecord: %n\n" | ||||
|   recordVal; | ||||
|  | ||||
| Printf.printf | ||||
|   "\nproof that thisReturnsA: %n\n" | ||||
|   (thisReturnsA ()); | ||||
|  | ||||
| /* Pattern matching */ | ||||
| let blah arg => | ||||
|   switch arg { | ||||
|   /* Comment before Bar */ | ||||
|   | /* Comment between bar/pattern */ Red _ => 1 | ||||
|   /* Comment Before non-first bar */ | ||||
|   | /* Comment betwen bar/pattern */ Black _ => 0 | ||||
|   | Green _ => 0 | ||||
|   }; | ||||
|  | ||||
| /* Any function that pattern matches a multicase match is interpretted as a | ||||
|  * single arg that is then matched on. Instead of the above `blah` example:*/ | ||||
| let blah = | ||||
|   fun | ||||
|   | Red _ => 1 | ||||
|   | Black _ => 0 | ||||
|   | Green _ => 1; | ||||
|  | ||||
| /* `fun a => a` is read as "a function that maps a to a". Then the */ | ||||
| /* above example is read: "a function that 'either maps' Red to.. or maps .." */ | ||||
| /* Thc00f564e first bar is read as "either maps" */ | ||||
| /* Curried form is not supported: | ||||
|       let blah x | Red _ => 1 | Black _ => 0; | ||||
|       Theres no sugar rule for dropping => fun, only = fun | ||||
|    */ | ||||
| /* let blahCurriedX x => fun  /* See, nothing says we can drop the => fun */ */ | ||||
| /*   |(Red x | Black x | Green x) => 1     /* With some effort, we can ammend the sugar rule that would */ */ | ||||
| /*   | Black x => 0                       /* Allow us to drop any => fun.. Just need to make pattern matching */ */ | ||||
| /*   | Green x => 0;                      /* Support that */ */ | ||||
| /*  */ | ||||
| let blahCurriedX x => | ||||
|   fun | ||||
|   | Red x | ||||
|   | Black x | ||||
|   | Green x => | ||||
|     1 /* With some effort, we can ammend the sugar rule that would */ | ||||
|   | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */ | ||||
|   | Green x => 0; /* Support that */ | ||||
|  | ||||
| let sameThingInLocal = { | ||||
|   let blahCurriedX x => | ||||
|     fun | ||||
|     | Red x | ||||
|     | Black x | ||||
|     | Green x => | ||||
|       1 /* With some effort, we can ammend the sugar rule that would */ | ||||
|     | Black x => 0 /* Allow us to drop any => fun.. Just need to make pattern matching */ | ||||
|     | Green x => 0; /* Support that */ | ||||
|   blahCurriedX | ||||
| }; | ||||
|  | ||||
| /* This should be parsed/printed exactly as the previous */ | ||||
| let blahCurriedX x => | ||||
|   fun | ||||
|   | Red x | ||||
|   | Black x | ||||
|   | Green x => 1 | ||||
|   | Black x => 0 | ||||
|   | Green x => 0; | ||||
|  | ||||
| /* Any time there are multiple match cases we require a leading BAR */ | ||||
| let v = Red 10; | ||||
|  | ||||
| let Black x | Red x | Green x = v; /* So this NON-function still parses */ | ||||
|  | ||||
| /* This doesn't parse, however (and it doesn't in OCaml either): | ||||
|      let | Black x | Red x | Green x = v; | ||||
|    */ | ||||
| print_int x; | ||||
|  | ||||
| /* Scoping: Let sequences. Familiar syntax for lexical ML style scope and | ||||
|    sequences. */ | ||||
| let res = { | ||||
|   let a = "a starts out as"; | ||||
|   { | ||||
|     print_string a; | ||||
|     let a = 20; | ||||
|     print_int a | ||||
|   }; | ||||
|   print_string a | ||||
| }; | ||||
|  | ||||
| let res = { | ||||
|   let a = "first its a string"; | ||||
|   let a = 20; | ||||
|   print_int a; | ||||
|   print_int a; | ||||
|   print_int a | ||||
| }; | ||||
|  | ||||
| let res = { | ||||
|   let a = "a is always a string"; | ||||
|   print_string a; | ||||
|   let b = 30; | ||||
|   print_int b | ||||
| }; | ||||
|  | ||||
| /* let result = LyList.map (fun | [] => true | _ => false) []; */ | ||||
| /* OTHERWISE: You cannot tell if a is the first match case falling through or | ||||
|  * a curried first arg */ | ||||
| /* let blah = fun a | patt => 0 | anotherPatt => 1; */ | ||||
| /* let blah a patt => 0 | anotherPatt => 1; */ | ||||
| /*simple pattern  EQUALGREATER      expr */ | ||||
| let blah a {blahBlah} => a; | ||||
|  | ||||
| /*            match_case             */ | ||||
| /*     pattern EQUALGREATER  expr */ | ||||
| let blah = | ||||
|   fun | ||||
|   | Red _ => 1 | ||||
|   | Black _ => 0 | ||||
|   | Green _ => 0; | ||||
|  | ||||
| /* Won't work! */ | ||||
| /* let arrowFunc = fun a b => print_string "returning aplusb from arrow"; a + b;;  */ | ||||
| let arrowFunc a b => { | ||||
|   print_string "returning aplusb from arrow"; | ||||
|   a + b | ||||
| }; | ||||
|  | ||||
| let add a b => { | ||||
|   let extra = { | ||||
|     print_string "adding"; | ||||
|     0 | ||||
|   }; | ||||
|   let anotherExtra = 0; | ||||
|   extra + a + b + anotherExtra | ||||
| }; | ||||
|  | ||||
| print_string (string_of_int (add 4 34)); | ||||
|  | ||||
| let dummy _ => 10; | ||||
|  | ||||
| dummy res1; | ||||
|  | ||||
| dummy res2; | ||||
|  | ||||
| dummy res3; | ||||
|  | ||||
| /* Some edge cases */ | ||||
| let myFun firstArg (Red x | Black x | Green x) => | ||||
|   firstArg + x; | ||||
|  | ||||
| let matchesWithWhen a => | ||||
|   switch a { | ||||
|   | Red x when 1 > 0 => 10 | ||||
|   | Red _ => 10 | ||||
|   | Black x => 10 | ||||
|   | Green x => 10 | ||||
|   }; | ||||
|  | ||||
| let matchesWithWhen = | ||||
|   fun | ||||
|   | Red x when 1 > 0 => 10 | ||||
|   | Red _ => 10 | ||||
|   | Black x => 10 | ||||
|   | Green x => 10; | ||||
|  | ||||
| let matchesOne (`Red x) => 10; | ||||
|  | ||||
| /* | ||||
|  Typical OCaml would make you *wrap the functions in parens*! This is because it | ||||
|  can't tell if a semicolon is a sequence operator. Even if we had records use | ||||
|  commas to separate fields, | ||||
|  */ | ||||
| type adders = { | ||||
|   addTwoNumbers: int => int => int, | ||||
|   addThreeNumbers: int => int => int => int, | ||||
|   addThreeNumbersTupled: (int, int, int) => int | ||||
| }; | ||||
|  | ||||
| let myRecordWithFunctions = { | ||||
|   addTwoNumbers: fun a b => a + b, | ||||
|   addThreeNumbers: fun a b c => a + b + c, | ||||
|   addThreeNumbersTupled: fun (a, b, c) => | ||||
|     a + b + c | ||||
| }; | ||||
|  | ||||
| let result = | ||||
|   myRecordWithFunctions.addThreeNumbers 10 20 30; | ||||
|  | ||||
| let result = | ||||
|   myRecordWithFunctions.addThreeNumbersTupled ( | ||||
|     10, | ||||
|     20, | ||||
|     30 | ||||
|   ); | ||||
|  | ||||
| let lookTuplesRequireParens = (1, 2); | ||||
|  | ||||
| /* let thisDoesntParse = 1, 2;  */ | ||||
| let tupleInsideAParenSequence = { | ||||
|   print_string "look, a tuple inside a sequence"; | ||||
|   let x = 10; | ||||
|   (x, x) | ||||
| }; | ||||
|  | ||||
| let tupleInsideALetSequence = { | ||||
|   print_string "look, a tuple inside a sequence"; | ||||
|   let x = 10; | ||||
|   (x, x) | ||||
| }; | ||||
|  | ||||
| /* We *require* that function return types be wrapped in | ||||
|    parenthesis. In this example, there's no ambiguity */ | ||||
| let makeIncrementer (delta: int) :(int => int) => | ||||
|   fun a => a + delta; | ||||
|  | ||||
| /* We could even force that consistency with let bindings - it's allowed | ||||
|       currently but not forced. | ||||
|    */ | ||||
| let myAnnotatedValBinding: int = 10; | ||||
|  | ||||
| /* Class functions (constructors) and methods are unified in the same way */ | ||||
| class classWithNoArg = { | ||||
|   method x = 0; | ||||
|   method y = 0; | ||||
| }; | ||||
|  | ||||
| /* This parses but doesn't type check | ||||
|      class myClass init => object | ||||
|        method x => init | ||||
|        method y => init | ||||
|      end; | ||||
|    */ | ||||
| let myFunc (a: int) (b: int) :(int, int) => ( | ||||
|   a, | ||||
|   b | ||||
| ); | ||||
|  | ||||
| let myFunc (a: int) (b: int) :list int => [1]; | ||||
|  | ||||
| let myFunc (a: int) (b: int) :point => { | ||||
|   x: a, | ||||
|   y: b | ||||
| }; | ||||
|  | ||||
| let myFunc (a: int, b: int) :point => { | ||||
|   x: a, | ||||
|   y: b | ||||
| }; | ||||
|  | ||||
| type myThing = (int, int); | ||||
|  | ||||
| type stillARecord = {name: string, age: int}; | ||||
|  | ||||
| /* Rebase latest OCaml to get the following: And fixup | ||||
|    `generalized_constructor_arguments` according to master. */ | ||||
| /* type ('a, 'b) myOtherThing = Leaf {first:'a, second: 'b} | Null; */ | ||||
| type branch 'a 'b = {first: 'a, second: 'b}; | ||||
|  | ||||
| type myOtherThing 'a 'b = | ||||
|   | Leaf (branch 'a 'b) | ||||
|   | Null; | ||||
|  | ||||
| type yourThing = myOtherThing int int; | ||||
|  | ||||
| /* Conveniently - this parses exactly how you would intend! No *need* to wrap | ||||
|    in an extra [], but it doesn't hurt */ | ||||
| /* FIXME type lookAtThesePolyVariants = list [`Red] ; */ | ||||
| /* FIXME type bracketsGroupMultipleParamsAndPrecedence = list (list (list [`Red])); */ | ||||
| /* FIXME type youCanWrapExtraIfYouWant = (list [`Red]); */ | ||||
| /* FIXME type hereAreMultiplePolyVariants = list [`Red | `Black]; */ | ||||
| /* FIXME type hereAreMultiplePolyVariantsWithOptionalWrapping = list ([`Red | `Black]); */ | ||||
| /* | ||||
|    /* Proposal: ES6 style lambdas: */ | ||||
|  | ||||
|    /* Currying */ | ||||
|    let lookES6Style = (`Red x) (`Black y) => { }; | ||||
|    let lookES6Style (`Red x) (`Black y) => { }; | ||||
|  | ||||
|    /* Matching the single argument */ | ||||
|    let lookES6Style = oneArg => match oneArg with | ||||
|      | `Red x => x | ||||
|      | `Black x => x; | ||||
|  | ||||
|    /* The "trick" to currying that we already have is basically the same - we just | ||||
|     * have to reword it a bit: | ||||
|     * From: | ||||
|     * "Any time you see [let x = fun ...] just replace it with [let x ...]" | ||||
|     * To: | ||||
|     * "Any time you see [let x = ... => ] just replace it with [let x ... => ]" | ||||
|     */ | ||||
|    let lookES6Style oneArg => match oneArg with | ||||
|      | `Red x => x | ||||
|      | `Black x => x; | ||||
|  | ||||
|  */ | ||||
|  | ||||
| /** Current OCaml Named Arguments. Any aliasing is more than just aliasing! | ||||
|     OCaml allows full on pattern matching of named args. */ | ||||
| /* | ||||
|  A: let named              ~a    ~b                = aa + bb in | ||||
|  B: let namedAlias         ~a:aa ~b:bb             = aa + bb in | ||||
|  C: let namedAnnot         ~(a:int) ~(b:int)       = a + b in | ||||
|  D: let namedAliasAnnot    ~a:(aa:int) ~b:(bb:int) = aa + bb in | ||||
|  E: let optional           ?a    ?b                              = 10 in | ||||
|  F: let optionalAlias      ?a:aa ?b:bb                           = 10 in | ||||
|  G: let optionalAnnot      ?(a:int option) ?(b:int option)       = 10 in | ||||
|  H: let optionalAliasAnnot ?a:(aa:int option) ?b:(bb:int option) = 10 in | ||||
|  /* | ||||
|  Look! When a default is provided, annotation causes inferred type of argument | ||||
|  to not be "option" since it's automatically destructured (because we know it | ||||
|  will always be available one way or another.) | ||||
|  */ | ||||
|  I: let defOptional           ?(a=10)    ?(b=10)                 = 10 in | ||||
|  J: let defOptionalAlias      ?a:(aa=10) ?b:(bb=10)              = 10 in | ||||
|  K: let defOptionalAnnot      ?(a:int=10) ?(b:int=10)            = 10 in | ||||
|                              \       \ | ||||
|                               \label_let_pattern opt_default: no longer needed in SugarML | ||||
|  | ||||
|  L: let defOptionalAliasAnnot ?a:(aa:int=10) ?b:(bb:int=10)      = 10 in | ||||
|                                \        \ | ||||
|                                 \let_pattern: still a useful syntactic building block in SugarML | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * In Reason, the syntax for named args uses double semicolon, since | ||||
|  * the syntax for lists uses ES6 style [], freeing up the ::. | ||||
|  */ | ||||
| let a = 10; | ||||
|  | ||||
| let b = 20; | ||||
|  | ||||
| /*A*/ | ||||
| let named a::a b::b => a + b; | ||||
|  | ||||
| type named = a::int => b::int => int; | ||||
|  | ||||
| /*B*/ | ||||
| let namedAlias a::aa b::bb => aa + bb; | ||||
|  | ||||
| let namedAlias a::aa b::bb => aa + bb; | ||||
|  | ||||
| type namedAlias = a::int => b::int => int; | ||||
|  | ||||
| /*C*/ | ||||
| let namedAnnot a::(a: int) b::(b: int) => 20; | ||||
|  | ||||
| /*D*/ | ||||
| let namedAliasAnnot a::(aa: int) b::(bb: int) => 20; | ||||
|  | ||||
| /*E*/ | ||||
| let myOptional a::a=? b::b=? () => 10; | ||||
|  | ||||
| type named = a::int? => b::int? => unit => int; | ||||
|  | ||||
| /*F*/ | ||||
| let optionalAlias a::aa=? b::bb=? () => 10; | ||||
|  | ||||
| /*G*/ | ||||
| let optionalAnnot a::(a: int)=? b::(b: int)=? () => 10; | ||||
|  | ||||
| /*H*/ | ||||
| let optionalAliasAnnot | ||||
|     a::(aa: int)=? | ||||
|     b::(bb: int)=? | ||||
|     () => 10; | ||||
|  | ||||
| /*I: */ | ||||
| let defOptional a::a=10 b::b=10 () => 10; | ||||
|  | ||||
| type named = a::int? => b::int? => unit => int; | ||||
|  | ||||
| /*J*/ | ||||
| let defOptionalAlias a::aa=10 b::bb=10 () => 10; | ||||
|  | ||||
| /*K*/ | ||||
| let defOptionalAnnot | ||||
|     a::(a: int)=10 | ||||
|     b::(b: int)=10 | ||||
|     () => 10; | ||||
|  | ||||
| /*L*/ | ||||
| let defOptionalAliasAnnot | ||||
|     a::(aa: int)=10 | ||||
|     b::(bb: int)=10 | ||||
|     () => 10; | ||||
|  | ||||
| /*M: Invoking them - Punned */ | ||||
| let resNotAnnotated = named a::a b::b; | ||||
|  | ||||
| /*N:*/ | ||||
| let resAnnotated: int = named a::a b::b; | ||||
|  | ||||
| /*O: Invoking them */ | ||||
| let resNotAnnotated = named a::a b::b; | ||||
|  | ||||
| /*P: Invoking them */ | ||||
| let resAnnotated: int = named a::a b::b; | ||||
|  | ||||
| /*Q: Here's why "punning" doesn't work!  */ | ||||
| /* Is b:: punned with a final non-named arg, or is b:: supplied b as one named arg? */ | ||||
| let b = 20; | ||||
|  | ||||
| let resAnnotated = named a::a b::b; | ||||
|  | ||||
| /*R: Proof that there are no ambiguities with return values being annotated */ | ||||
| let resAnnotated: ty = named a::a b; | ||||
|  | ||||
| /*S: Explicitly passed optionals are a nice way to say "use the default value"*/ | ||||
| let explictlyPassed = | ||||
|   myOptional a::?None b::?None; | ||||
|  | ||||
| /*T: Annotating the return value of the entire function call */ | ||||
| let explictlyPassedAnnotated: int = | ||||
|   myOptional a::?None b::?None; | ||||
|  | ||||
| /*U: Explicitly passing optional with identifier expression */ | ||||
| let a = None; | ||||
|  | ||||
| let explictlyPassed = myOptional a::?a b::?None; | ||||
|  | ||||
| let explictlyPassedAnnotated: int = | ||||
|   myOptional a::?a b::?None; | ||||
|  | ||||
| let nestedLet = { | ||||
|   let _ = 1; | ||||
|   () | ||||
| }; | ||||
|  | ||||
| let nestedLet = { | ||||
|   let _ = 1; | ||||
|   () | ||||
| }; | ||||
|  | ||||
| let nestedLet = { | ||||
|   let _ = 1; | ||||
|   () | ||||
| }; | ||||
|  | ||||
| let nestedLet = { | ||||
|   let _ = 1; | ||||
|   2 | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Showing many combinations of type annotations and named arguments. | ||||
|  */ | ||||
| type typeWithNestedNamedArgs = | ||||
|   outerOne::( | ||||
|     innerOne::int => innerTwo::int => int | ||||
|   ) => | ||||
|   outerTwo::int => | ||||
|   int; | ||||
|  | ||||
| type typeWithNestedOptionalNamedArgs = | ||||
|   outerOne:: | ||||
|     (innerOne::int => innerTwo::int => int)? => | ||||
|   outerTwo::int? => | ||||
|   int; | ||||
|  | ||||
| type typeWithNestedOptionalNamedArgs = | ||||
|   outerOne::list string? => outerTwo::int? => int; | ||||
|  | ||||
| let x = | ||||
|   callSomeFunction | ||||
|     withArg::10 andOtherArg::wrappedArg; | ||||
|  | ||||
| let res = { | ||||
|   (constraintedSequenceItem: string); | ||||
|   (dontKnowWheYoudWantToActuallyDoThis: string) | ||||
| }; | ||||
|  | ||||
| let res = { | ||||
|   ( | ||||
|     butTheyWillBePrintedWithAppropriateSpacing: string | ||||
|   ); | ||||
|   (soAsToInstillBestDevelopmentPractices: string) | ||||
| }; | ||||
|  | ||||
| let x = [ | ||||
|   (eachItemInListCanBeAnnotated: int), | ||||
|   (typeConstraints: float), | ||||
|   ( | ||||
|     tupleConstraints: int, | ||||
|     andNotFunctionInvocations: int | ||||
|   ) | ||||
| ]; | ||||
|  | ||||
| let x = [ | ||||
|   (butWeWillPrint: int), | ||||
|   (themAsSpaceSeparated: float), | ||||
|   (toInfluenceYour: int, developmentHabbits: int) | ||||
| ]; | ||||
|  | ||||
| let newRecord = { | ||||
|   ...(annotatedSpreadRecord: someRec), | ||||
|   x: y | ||||
| }; | ||||
|  | ||||
| let newRecord = { | ||||
|   ...(annotatedSpreadRecord: someRec), | ||||
|   blah: 0, | ||||
|   foo: 1 | ||||
| }; | ||||
|  | ||||
| let newRecord = { | ||||
|   ...( | ||||
|     youCanEvenCallMethodsHereAndAnnotate them: someRec | ||||
|   ), | ||||
|   blah: 0, | ||||
|   foo: 1 | ||||
| }; | ||||
|  | ||||
| let newRecord = { | ||||
|   ...( | ||||
|     youCanEvenCallMethodsHereAndAnnotate | ||||
|       them named::10: someRec | ||||
|   ), | ||||
|   blah: 0, | ||||
|   foo: 1 | ||||
| }; | ||||
|  | ||||
| let something: thing blah = aTypeAnnotation; | ||||
|  | ||||
| let something: thing blah = thisIsANamedArg; | ||||
|  | ||||
| let something: thing blah = aTypeAnnotation; | ||||
|  | ||||
| let something: blah = thisIsANamedArg thing; | ||||
|  | ||||
| let something: blah = typeAnnotation thing; | ||||
|  | ||||
| let newRecord = { | ||||
|   ...( | ||||
|     heresAFunctionWithNamedArgs argOne::i: annotatedResult | ||||
|   ), | ||||
|   soAsToInstill: 0, | ||||
|   developmentHabbits: 1 | ||||
| }; | ||||
|  | ||||
| [@@@thisIsAThing]; | ||||
|  | ||||
| let x = 10; | ||||
|  | ||||
| /* Ensure that the parenthesis are preserved here because they are | ||||
|  * important: | ||||
|  */ | ||||
| let something = | ||||
|   fun | ||||
|   | None => ( | ||||
|       fun | ||||
|       | [] => "emptyList" | ||||
|       | [_, ..._] => "nonEmptyList" | ||||
|     ) | ||||
|   | Some _ => ( | ||||
|       fun | ||||
|       | [] => "emptyList" | ||||
|       | [_, ..._] => "nonEmptyList" | ||||
|     ); | ||||
|  | ||||
| /*  A | B = X; */ | ||||
| let A | B = X; | ||||
|  | ||||
| /*  A | (B | C) = X; */ | ||||
| let A | (B | C) = X; | ||||
|  | ||||
| /* (A | B) | (C | D) = X; */ | ||||
| let A | B | (C | D) = X; | ||||
|  | ||||
| /*  A | B | (C | D) = X; */ | ||||
| let A | B | (C | D) = X; | ||||
|  | ||||
| /* (A | B) | C = X; */ | ||||
| let A | B | C = X; | ||||
|  | ||||
| /*  A | B | C = X; */ | ||||
| let A | B | C = X; | ||||
|  | ||||
|  | ||||
| /** External function declaration | ||||
|  * | ||||
|  */ | ||||
| external f : int => int = "foo"; | ||||
|  | ||||
| let x = {contents: 0}; | ||||
|  | ||||
| let unitVal = x.contents = 210; | ||||
							
								
								
									
										19
									
								
								samples/Regular Expression/modeline-emacs.regexp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								samples/Regular Expression/modeline-emacs.regexp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| -\*- | ||||
| (?: | ||||
| 	\s* | ||||
| 	(?= [^:;\s]+ \s* -\*-) | ||||
| 	| | ||||
| 	(?: | ||||
| 		.*?[;\s] | ||||
| 		| | ||||
| 		(?<=-\*-) | ||||
| 	) | ||||
| 	mode\s*:\s* | ||||
| ) | ||||
| ([^:;\s]+) | ||||
|  | ||||
| (?= | ||||
| 	[\s;] | (?<![-*]) -\*- | ||||
| ) | ||||
| .*? | ||||
| -\*- | ||||
							
								
								
									
										27
									
								
								samples/Regular Expression/modeline-vim.regexp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								samples/Regular Expression/modeline-vim.regexp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| (?: | ||||
| 	(?:\s|^) | ||||
| 	vi | ||||
| 	(?:m[<=>]?\d+|m)? | ||||
| 	| | ||||
| 	[\t\x20] | ||||
| 	ex | ||||
| ) | ||||
| (?= | ||||
| 	: (?=\s* set? \s [^\n:]+ :) | | ||||
| 	: (?!\s* set? \s) | ||||
| ) | ||||
|  | ||||
| (?: | ||||
| 	(?:\s|\s*:\s*) | ||||
| 	\w* | ||||
| 	(?: | ||||
| 		\s*= | ||||
| 		(?:[^\n\\\s]|\\.)* | ||||
| 	)? | ||||
| )* | ||||
|  | ||||
| [\s:] | ||||
| (?:filetype|ft|syntax) | ||||
| \s*= | ||||
| (MODE_NAME_HERE) | ||||
| (?=\s|:|$) | ||||
							
								
								
									
										1
									
								
								samples/Regular Expression/ordinal.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Regular Expression/ordinal.regex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| \b(\d*1[1-3]th|\d*0th|(?:(?!11st)\d)*1st|\d*2nd|(?:(?!13rd)\d*)3rd|\d*[4-9]th)\b | ||||
							
								
								
									
										1
									
								
								samples/Regular Expression/url.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Regular Expression/url.regex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /^([^\/#\?]*:?\/\/)?(\/?(?:[^\/#\?]+\/)*)?([^\/#\?]+)?(?:\/(?=$))?(\?[^#]*)?(#.*)?$/ | ||||
							
								
								
									
										2934
									
								
								samples/SQL/zipcodes.uk.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2934
									
								
								samples/SQL/zipcodes.uk.mysql
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										54
									
								
								samples/Text/filenames/COPYING.regex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								samples/Text/filenames/COPYING.regex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| $OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $ | ||||
|  | ||||
| Copyright 1992, 1993, 1994 Henry Spencer.  All rights reserved. | ||||
| This software is not subject to any license of the American Telephone | ||||
| and Telegraph Company or of the Regents of the University of California. | ||||
|  | ||||
| Permission is granted to anyone to use this software for any purpose on | ||||
| any computer system, and to alter it and redistribute it, subject | ||||
| to the following restrictions: | ||||
|  | ||||
| 1. The author is not responsible for the consequences of use of this | ||||
|    software, no matter how awful, even if they arise from flaws in it. | ||||
|  | ||||
| 2. The origin of this software must not be misrepresented, either by | ||||
|    explicit claim or by omission.  Since few users ever read sources, | ||||
|    credits must appear in the documentation. | ||||
|  | ||||
| 3. Altered versions must be plainly marked as such, and must not be | ||||
|    misrepresented as being the original software.  Since few users | ||||
|    ever read sources, credits must appear in the documentation. | ||||
|  | ||||
| 4. This notice may not be removed or altered. | ||||
|  | ||||
| =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||
| /*- | ||||
|  * Copyright (c) 1994 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  *	@(#)COPYRIGHT	8.1 (Berkeley) 3/16/94 | ||||
|  */ | ||||
							
								
								
									
										339
									
								
								samples/Text/filenames/LICENSE.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								samples/Text/filenames/LICENSE.mysql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,339 @@ | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|                        Version 2, June 1991 | ||||
|  | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc., | ||||
|  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Lesser General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
|  | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
|  | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
|  | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                     GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
|  | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
|  | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
|  | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
|  | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
|  | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
|  | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
|  | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
|  | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
|  | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
|  | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
|  | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
|  | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
|  | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
|  | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
|  | ||||
|                             NO WARRANTY | ||||
|  | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
|  | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; either version 2 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU General Public License along | ||||
|     with this program; if not, write to the Free Software Foundation, Inc., | ||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
|  | ||||
|     Gnomovision version 69, Copyright (C) year name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
|  | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
|  | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
|  | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
|  | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
|  | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Lesser General | ||||
| Public License instead of this License. | ||||
							
								
								
									
										24
									
								
								samples/Text/filenames/README.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								samples/Text/filenames/README.mysql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| README for users interested in using MySQL as a triplestore backend | ||||
| =================================================================== | ||||
|  | ||||
| The KiWi Triple Store used by Apache Marmotta supports different database | ||||
| backends, including H2, PostgreSQL and MySQL. However, for legal reasons, | ||||
| we are not allowed to distribute the MySQL connector library together with | ||||
| the Apache Marmotta source code or binaries, as it is licensed under GPL | ||||
| license. | ||||
|  | ||||
| Nonetheless, it is possible to use MySQL by downloading and installing the | ||||
| connector manually: | ||||
|     1.  download and unpack the MySQL Connector/J from | ||||
|         http://dev.mysql.com/downloads/connector/j/ | ||||
|     2.  copy the mysql-connector-java-5.x.x.jar file to | ||||
|         a. the library directory of the application server | ||||
|            (e.g. $TOMCAT_HOME/lib) | ||||
|         -- OR -- | ||||
|         b. the library directory of the Apache Marmotta Web application | ||||
|            (e.g. $TOMCAT_HOME/webapps/marmotta/WEB-INF/lib) | ||||
|     3.  restart the application server | ||||
|  | ||||
| Apache Marmotta will then automatically be able to use the MySQL connector | ||||
| to connect to a MySQL database. Please note that Marmotta requires at least | ||||
| MySQL 5.x, because it makes use of nested queries and foreign keys. | ||||
							
								
								
									
										384
									
								
								samples/TypeScript/import.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								samples/TypeScript/import.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,384 @@ | ||||
| // Fixture taken from https://github.com/graphcool/console/blob/dev/src/components/onboarding/PlaygroundCPopup/PlaygroundCPopup.tsx | ||||
|  | ||||
| import * as React from 'react' | ||||
| import {withRouter} from 'react-router' | ||||
| import {connect} from 'react-redux' | ||||
| import {bindActionCreators} from 'redux' | ||||
| import {nextStep, selectExample} from '../../../actions/gettingStarted' | ||||
| import {classnames} from '../../../utils/classnames' | ||||
| import Loading from '../../Loading/Loading' | ||||
| import {GettingStartedState} from '../../../types/gettingStarted' | ||||
| import {Example} from '../../../types/types' | ||||
| const classes: any = require('./PlaygroundCPopup.scss') | ||||
| import {$p} from 'graphcool-styles' | ||||
| import * as cx from 'classnames' | ||||
|  | ||||
| interface Tutorial { | ||||
|   title: string | ||||
|   description: string | ||||
|   image: string | ||||
|   link: string | ||||
| } | ||||
|  | ||||
| const guides: Tutorial[] = [ | ||||
|   { | ||||
|     title: 'Learnrelay.org', | ||||
|     description: 'A comprehensive, interactive introduction to Relay', | ||||
|     link: 'https://learnrelay.org/', | ||||
|     image: require('../../../assets/graphics/relay.png'), | ||||
|   }, | ||||
|   { | ||||
|     title: 'GraphQL and the amazing Apollo Client', | ||||
|     description: 'Explore an Application built using React and Angular 2', | ||||
|     link: 'https://medium.com/google-developer-experts/graphql-and-the-amazing-apollo-client-fe57e162a70c', | ||||
|     image: require('../../../assets/graphics/apollo.png'), | ||||
|   }, | ||||
|   { | ||||
|     title: 'Introducing Lokka', | ||||
|     description: 'A Simple JavaScript Client for GraphQL', | ||||
|     link: 'https://voice.kadira.io/introducing-lokka-a-simple-javascript-client-for-graphql-e0802695648c', | ||||
|     image: require('../../../assets/graphics/lokka.png'), | ||||
|   }, | ||||
| ] | ||||
|  | ||||
| const examples = { | ||||
|   ReactRelay: { | ||||
|     path: 'react-relay-instagram-example', | ||||
|     description: 'React + Relay', | ||||
|   }, | ||||
|   ReactApollo: { | ||||
|     path: 'react-apollo-instagram-example', | ||||
|     description: 'React + Apollo', | ||||
|   }, | ||||
|   ReactNativeApollo: { | ||||
|     path: 'react-native-apollo-instagram-example', | ||||
|     description: 'React Native + Apollo', | ||||
|   }, | ||||
|   AngularApollo: { | ||||
|     path: 'angular-apollo-instagram-example', | ||||
|     description: 'Angular + Apollo', | ||||
|   }, | ||||
| } | ||||
|  | ||||
| interface Props { | ||||
|   id: string | ||||
|   projectId: string | ||||
|   nextStep: () => Promise<void> | ||||
|   selectExample: (selectedExample: Example) => any | ||||
|   gettingStartedState: GettingStartedState | ||||
| } | ||||
|  | ||||
| interface State { | ||||
|   mouseOver: boolean | ||||
| } | ||||
|  | ||||
| class PlaygroundCPopup extends React.Component<Props, State> { | ||||
|  | ||||
|   state = { | ||||
|     mouseOver: false, | ||||
|   } | ||||
|  | ||||
|   refs: { | ||||
|     [key: string]: any | ||||
|     exampleAnchor: HTMLDivElement | ||||
|     congratsAnchor: HTMLDivElement | ||||
|     scroller: HTMLDivElement, | ||||
|   } | ||||
|  | ||||
|   componentDidUpdate(prevProps: Props, prevState: State) { | ||||
|     if (prevProps.gettingStartedState.selectedExample !== this.props.gettingStartedState.selectedExample) { | ||||
|       this.refs.scroller.scrollTop += this.refs.exampleAnchor.getBoundingClientRect().top | ||||
|     } | ||||
|  | ||||
|     if (prevProps.gettingStartedState.isCurrentStep('STEP5_WAITING') | ||||
|         && this.props.gettingStartedState.isCurrentStep('STEP5_DONE')) { | ||||
|       this.refs.scroller.scrollTop += this.refs.congratsAnchor.getBoundingClientRect().top | ||||
|  | ||||
|       const snd = new Audio(require('../../../assets/success.mp3') as string) | ||||
|       snd.volume = 0.5 | ||||
|       snd.play() | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     const {mouseOver} = this.state | ||||
|     const {selectedExample} = this.props.gettingStartedState | ||||
|     const hovering = !this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5') | ||||
|     const downloadUrl = (example) => `${__BACKEND_ADDR__}/resources/getting-started-example?repository=${examples[example].path}&project_id=${this.props.projectId}&user=graphcool-examples` // tslint:disable-line | ||||
|     return ( | ||||
|       <div | ||||
|         className='flex justify-center items-start w-100 h-100' | ||||
|         style={{ | ||||
|           transition: 'background-color 0.3s ease', | ||||
|           backgroundColor: hovering ? 'rgba(255,255,255,0.7)' : 'transparent', | ||||
|           width: 'calc(100% - 266px)', | ||||
|           pointerEvents: 'none', | ||||
|           overflow: 'hidden', | ||||
|         }} | ||||
|       > | ||||
|         <div | ||||
|           ref='scroller' | ||||
|           className='flex justify-center w-100' | ||||
|           style={{ | ||||
|             transition: 'height 0.5s ease', | ||||
|             height: hovering ? '100%' : mouseOver ? '190%' : '210%', | ||||
|             pointerEvents: hovering ? 'all' : 'none', | ||||
|             cursor: hovering ? 'auto' : 'pointer', | ||||
|             overflow: hovering ? 'auto' : 'hidden', | ||||
|             alignItems: selectedExample ? 'flex-start' : 'center', | ||||
|           }} | ||||
|         > | ||||
|           <div | ||||
|             className='bg-white br-2 shadow-2 mv-96' | ||||
|             style={{ | ||||
|               minWidth: 600, | ||||
|               maxWidth: 800, | ||||
|               pointerEvents: 'all', | ||||
|             }} | ||||
|             onMouseLeave={() => this.setState({ mouseOver: false })} | ||||
|             onMouseEnter={() => { | ||||
|               this.setState({ mouseOver: true }) | ||||
|             }} | ||||
|             onMouseOver={(e: any) => { | ||||
|               if (this.props.gettingStartedState.isCurrentStep('STEP4_CLICK_TEASER_STEP5')) { | ||||
|                 this.props.nextStep() | ||||
|               } | ||||
|             }} | ||||
|           > | ||||
|             <div className='ma-16 tc pb-25'> | ||||
|               <div className='fw3 ma-38 f-38'> | ||||
|                 You did it! Time to run an example. | ||||
|               </div> | ||||
|               <div className='fw2 f-16 mh-96 lh-1-4'> | ||||
|                 You have successfully set up your own Instagram backend.{' '} | ||||
|                 When building an app with Graphcool you can easily explore queries in the{' '} | ||||
|                 playground and "copy & paste" selected queries into your code.{' '} | ||||
|                 Of course, to do so, you need to implement the frontend first. | ||||
|               </div> | ||||
|               <div className='fw2 f-16 mh-96 lh-1-4 mt-16'> | ||||
|                 <div>We put together a simple app to show and add posts</div> | ||||
|                 <div>using the backend you just built, to test and run it locally.</div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='ma-16 tc pb-25'> | ||||
|               <div className='fw3 ma-38 f-25'> | ||||
|                 Select your preferred technology to download the example. | ||||
|               </div> | ||||
|               <div className='flex justify-between items-center w-100' ref='exampleAnchor'> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactRelay' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactRelay')} | ||||
|                 > | ||||
|                   React + Relay | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactApollo')} | ||||
|                 > | ||||
|                   React + Apollo | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'ReactNativeApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('ReactNativeApollo')} | ||||
|                 > | ||||
|                   React Native + Apollo | ||||
|                 </div> | ||||
|                 <div | ||||
|                   className={classnames( | ||||
|                     classes.exampleButton, | ||||
|                     selectedExample === 'AngularApollo' ? classes.active : '', | ||||
|                   )} | ||||
|                   onClick={() => this.props.selectExample('AngularApollo')} | ||||
|                 > | ||||
|                   Angular + Apollo | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           {selectedExample && | ||||
|           <div> | ||||
|             <div className='w-100'> | ||||
|               <iframe | ||||
|                 className='w-100' | ||||
|                 height='480' | ||||
|                 allowFullScreen | ||||
|                 frameBorder='0' | ||||
|                 src={`https://www.youtube.com/embed/${this.getExampleVideoUrl(selectedExample)}`} | ||||
|               /> | ||||
|             </div> | ||||
|             <div | ||||
|               className='w-100 pa-25' | ||||
|               style={{ | ||||
|                 backgroundColor: '#FEF5D2', | ||||
|               }} | ||||
|             > | ||||
|               <div className='mt-25 mb-38 w-100 flex justify-center'> | ||||
|                 <a | ||||
|                   href={downloadUrl(selectedExample)} | ||||
|                   className='pa-16 white' | ||||
|                   style={{ | ||||
|                     backgroundColor: '#4A90E2', | ||||
|                   }} | ||||
|                 > | ||||
|                   Download example | ||||
|                 </a> | ||||
|               </div> | ||||
|               <div className='code dark-gray'> | ||||
|                 <div className='black-50'> | ||||
|                   # To see the example in action, run the following commands: | ||||
|                 </div> | ||||
|                 <div className='mv-16'> | ||||
|                   <div className='black'> | ||||
|                     npm install | ||||
|                   </div> | ||||
|                   <div className='black'> | ||||
|                     npm start | ||||
|                   </div> | ||||
|                 </div> | ||||
|                 <div className='black-50'> | ||||
|                   # You can now open the app on localhost:3000 | ||||
|                 </div> | ||||
|                 <div className='black-50'> | ||||
|                   # Please come back to this page once you're done. We're waiting here. 💤 | ||||
|                 </div> | ||||
|                 <div className={cx($p.w100, $p.flex, $p.flexRow, $p.justifyCenter, $p.mt25)}> | ||||
|                   <a href='#' onClick={ | ||||
|                     (e: any) => { | ||||
|                       e.preventDefault() | ||||
|                       // we need to skip the 'STEP5_WAITING' step | ||||
|                       this.props.nextStep() | ||||
|                       this.props.nextStep() | ||||
|                       this.props.nextStep() | ||||
|                     } | ||||
|                   }> | ||||
|                     Skip | ||||
|                   </a> | ||||
|                 </div> | ||||
|               </div> | ||||
|               {this.props.gettingStartedState.isCurrentStep('STEP5_WAITING') && | ||||
|               <div className='w-100 mv-96 flex justify-center'> | ||||
|                 <Loading /> | ||||
|               </div> | ||||
|               } | ||||
|             </div> | ||||
|           </div> | ||||
|           } | ||||
|         {this.props.gettingStartedState.isCurrentStep('STEP5_DONE') && | ||||
|           <div className='w-100 mb-96' ref='congratsAnchor'> | ||||
|             <div className='flex items-center flex-column pv-60 fw1'> | ||||
|               <div className='f-96'> | ||||
|                 🎉 | ||||
|               </div> | ||||
|               <div className='f-38 mt-38'> | ||||
|                 Congratulations! | ||||
|               </div> | ||||
|               <div className='f-38 mt-16'> | ||||
|                 We knew you had it in you. | ||||
|               </div> | ||||
|               <div className='f-16 mv-38'> | ||||
|                 Now go out there and build amazing things! | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='flex justify-between ph-25 pv-16'> | ||||
|               <div className='w-50 pr-16'> | ||||
|                 <div className='ttu ls-2 f-16 fw1 lh-1-4'> | ||||
|                   Get started on your own<br />with those excellent tutorials | ||||
|                 </div> | ||||
|                 <div className='mv-38'> | ||||
|                   {guides.map(guide => this.renderBox(guide))} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div className='w-50 pl-16'> | ||||
|                 <div className='ttu ls-2 f-16 fw1 lh-1-4'> | ||||
|                   Get more out of Graphcool<br />with our guides | ||||
|                 </div> | ||||
|                 <div className={`h-100 justify-start flex flex-column mv-38 ${classes.guides}`}> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/quickstart-2-daisheeb9x' | ||||
|                     className={`${classes.one} fw4 black db flex items-center mb-25`} | ||||
|                     target='_blank' | ||||
|                   > | ||||
|                     Declaring Relations | ||||
|                   </a> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/quickstart-3-saigai7cha' | ||||
|                     className={`${classes.two} fw4 black db flex items-center mb-25`} | ||||
|                     target='_blank' | ||||
|                   > | ||||
|                     Implementing Business Logic | ||||
|                   </a> | ||||
|                   <a | ||||
|                     href='https://graph.cool/docs/tutorials/thinking-in-terms-of-graphs-ahsoow1ool' | ||||
|                     target='_blank' | ||||
|                     className={`${classes.three} fw4 black db flex items-center mb-25`} | ||||
|                   > | ||||
|                     Thinking in terms of graphs | ||||
|                   </a> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className='flex w-100 justify-center'> | ||||
|               <div | ||||
|                 className='f-25 mv-16 pv-16 ph-60 ls-1 ttu pointer bg-accent white dim' | ||||
|                 onClick={this.props.nextStep} | ||||
|               > | ||||
|                 Finish Onboarding | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|           } | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   private renderBox = (tutorial: Tutorial) => { | ||||
|     return ( | ||||
|       <div key={tutorial.title} className='pa-16 mb-16 lh-1-4' style={{background: 'rgba(0,0,0,0.03)'}}> | ||||
|         <a className='flex items-center' href={tutorial.link} target='_blank'> | ||||
|           <div className='flex items-center justify-center' style={{ flex: '0 0 60px', height: 60 }}> | ||||
|             <img src={tutorial.image}/> | ||||
|           </div> | ||||
|           <div className='flex flex-column space-between ml-38'> | ||||
|             <div className='mb-6 dark-gray f-16'> | ||||
|               {tutorial.title} | ||||
|             </div> | ||||
|             <div className='fw1 mid-gray'> | ||||
|               {tutorial.description} | ||||
|             </div> | ||||
|           </div> | ||||
|         </a> | ||||
|       </div> | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   private getExampleVideoUrl = (example: Example): string => { | ||||
|     switch (example) { | ||||
|       case 'ReactRelay': return '_dj9Os2ev4M' | ||||
|       case 'ReactApollo': return '9nlwyPUPXjQ' | ||||
|       case 'ReactNativeApollo': return '9nlwyPUPXjQ' | ||||
|       case 'AngularApollo': return 'EzD5fJ-uniI' | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| const mapStateToProps = (state) => { | ||||
|   return { | ||||
|     gettingStartedState: state.gettingStarted.gettingStartedState, | ||||
|   } | ||||
| } | ||||
|  | ||||
| const mapDispatchToProps = (dispatch) => { | ||||
|   return bindActionCreators({nextStep, selectExample}, dispatch) | ||||
| } | ||||
|  | ||||
| export default connect(mapStateToProps, mapDispatchToProps)(withRouter(PlaygroundCPopup)) | ||||
							
								
								
									
										366
									
								
								samples/TypeScript/react-native.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										366
									
								
								samples/TypeScript/react-native.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,366 @@ | ||||
| // Fixture taken from https://github.com/bgrieder/RNTSExplorer/blob/master/typescript/components/TextExample.ios.tsx | ||||
|  | ||||
| /** | ||||
|  * The examples provided by Facebook are for non-commercial testing and | ||||
|  * evaluation purposes only. | ||||
|  * | ||||
|  * Facebook reserves all rights not expressly granted. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
|  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL | ||||
|  * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | ||||
|  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  * | ||||
|  * Typescript rewrite by Bruno Grieder | ||||
|  */ | ||||
|  | ||||
| 'use strict' | ||||
|  | ||||
| import * as React from 'react-native'; | ||||
| import RNTSExample from '../RNTSExample' | ||||
| import RNTSExampleModule from '../RNTSExampleModule' | ||||
|  | ||||
| const { | ||||
|           StyleSheet, | ||||
|           Text, | ||||
|           View, | ||||
|           } = React | ||||
|  | ||||
|  | ||||
| const styles = StyleSheet.create( | ||||
|     { | ||||
|         backgroundColorText: { | ||||
|             left:            5, | ||||
|             backgroundColor: 'rgba(100, 100, 100, 0.3)' | ||||
|         }, | ||||
|         entity:              { | ||||
|             fontWeight: '500', | ||||
|             color:      '#527fe4', | ||||
|         }, | ||||
|     } | ||||
| ) | ||||
|  | ||||
| class Entity extends React.Component<any,any> { | ||||
|     render() { | ||||
|         return ( | ||||
|             <Text style={styles.entity}> | ||||
|                 {this.props.children} | ||||
|             </Text> | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
| interface AttrTogglerState { | ||||
|     fontWeight?: string | ||||
|     fontSize?: number | ||||
| } | ||||
|  | ||||
| class AttributeToggler extends React.Component<any, AttrTogglerState> { | ||||
|     componentWillMount() { | ||||
|         this.setState( | ||||
|             { | ||||
|                 fontWeight: '500', | ||||
|                 fontSize:   15 | ||||
|             } | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     private increaseSize = (): void => { | ||||
|         this.setState( { | ||||
|                            fontSize: this.state.fontSize + 1 | ||||
|                        } ) | ||||
|     } | ||||
|  | ||||
|     render() { | ||||
|         const curStyle: React.TextStyle = { fontSize: this.state.fontSize } | ||||
|         return ( | ||||
|             <Text> | ||||
|                 <Text style={curStyle}> | ||||
|                     Tap the controls below to change attributes. | ||||
|                 </Text> | ||||
|                 <Text> | ||||
|                     See how it will even work on{' '} | ||||
|                     <Text style={curStyle}> | ||||
|                         this nested text | ||||
|                     </Text> | ||||
|                     <Text onPress={this.increaseSize}> | ||||
|                         {'>> Increase Size <<'} | ||||
|                     </Text> | ||||
|                 </Text> | ||||
|             </Text> | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default { | ||||
|     title:       '<Text>', | ||||
|     description: 'Base component for rendering styled text.', | ||||
|     displayName: 'TextExample', | ||||
|     examples:    [ | ||||
|                      { | ||||
|                          title:  'Wrap', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      The text should wrap if it goes on multiple lines. See, this is going to | ||||
|                                      the next line. | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Padding', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text style={{padding: 10}}> | ||||
|                                      This text is indented by 10px padding on all sides. | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Family', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontFamily: 'Cochin'}}> | ||||
|                                          Cochin | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Cochin', fontWeight: 'bold'}}> | ||||
|                                          Cochin bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Helvetica'}}> | ||||
|                                          Helvetica | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Helvetica', fontWeight: 'bold'}}> | ||||
|                                          Helvetica bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Verdana'}}> | ||||
|                                          Verdana | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontFamily: 'Verdana', fontWeight: 'bold'}}> | ||||
|                                          Verdana bold | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Size', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontSize: 23}}> | ||||
|                                          Size 23 | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontSize: 8}}> | ||||
|                                          Size 8 | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Color', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{color: 'red'}}> | ||||
|                                          Red color | ||||
|                                      </Text> | ||||
|                                      <Text style={{color: 'blue'}}> | ||||
|                                          Blue color | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Weight', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontWeight: '100'}}> | ||||
|                                          Move fast and be ultralight | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: '200'}}> | ||||
|                                          Move fast and be light | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: 'normal'}}> | ||||
|                                          Move fast and be normal | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: 'bold'}}> | ||||
|                                          Move fast and be bold | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontWeight: '900'}}> | ||||
|                                          Move fast and be ultrabold | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Font Style', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{fontStyle: 'normal'}}> | ||||
|                                          Normal text | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontStyle: 'italic'}}> | ||||
|                                          Italic text | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'Nested', | ||||
|                          description: 'Nested text components will inherit the styles of their ' + | ||||
|                                       'parents (only backgroundColor is inherited from non-Text parents).  ' + | ||||
|                                       '<Text> only supports other <Text> and raw text (strings) as children.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text> | ||||
|                                          (Normal text, | ||||
|                                          <Text style={{fontWeight: 'bold'}}> | ||||
|                                              (and bold | ||||
|                                              <Text style={{fontSize: 11, color: '#527fe4'}}> | ||||
|                                                  (and tiny inherited bold blue) | ||||
|                                              </Text> | ||||
|                                              ) | ||||
|                                          </Text> | ||||
|                                          ) | ||||
|                                      </Text> | ||||
|                                      <Text style={{fontSize: 12}}> | ||||
|                                          <Entity>Entity Name</Entity> | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Text Align', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text style={{textAlign: 'left'}}> | ||||
|                                          left left left left left left left left left left left left left left left | ||||
|                                      </Text> | ||||
|                                      <Text style={{textAlign: 'center'}}> | ||||
|                                          center center center center center center center center center center center | ||||
|                                      </Text> | ||||
|                                      <Text style={{textAlign: 'right'}}> | ||||
|                                          right right right right right right right right right right right right right | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Spaces', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      A {'generated'} {' '} {'string'} and    some     spaces | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Line Height', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <Text> | ||||
|                                      <Text style={{lineHeight: 35}}> | ||||
|                                          A lot of space between the lines of this long passage that should | ||||
|                                          wrap once. | ||||
|                                      </Text> | ||||
|                                  </Text> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'Empty Text', | ||||
|                          description: 'It\'s ok to have Text with zero or null children.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <Text /> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'Toggling Attributes', | ||||
|                          render: (): React.ReactElement<any> => { | ||||
|                              return <AttributeToggler /> | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:       'backgroundColor attribute', | ||||
|                          description: 'backgroundColor is inherited from all types of views.', | ||||
|                          render:      function () { | ||||
|                              return ( | ||||
|                                  <View style={{backgroundColor: 'yellow'}}> | ||||
|                                      <Text> | ||||
|                                          Yellow background inherited from View parent, | ||||
|                                          <Text style={{backgroundColor: '#ffaaaa'}}> | ||||
|                                              {' '}red background, | ||||
|                                              <Text style={{backgroundColor: '#aaaaff'}}> | ||||
|                                                  {' '}blue background, | ||||
|                                                  <Text> | ||||
|                                                      {' '}inherited blue background, | ||||
|                                                      <Text style={{backgroundColor: '#aaffaa'}}> | ||||
|                                                          {' '}nested green background. | ||||
|                                                      </Text> | ||||
|                                                  </Text> | ||||
|                                              </Text> | ||||
|                                          </Text> | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'containerBackgroundColor attribute', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <View style={{flexDirection: 'row', height: 85}}> | ||||
|                                          <View style={{backgroundColor: '#ffaaaa', width: 150}}/> | ||||
|                                          <View style={{backgroundColor: '#aaaaff', width: 150}}/> | ||||
|                                      </View> | ||||
|                                      <Text style={[styles.backgroundColorText, {top: -80}]}> | ||||
|                                          Default containerBackgroundColor (inherited) + backgroundColor wash | ||||
|                                      </Text> | ||||
|                                      <Text style={[ | ||||
|                                             styles.backgroundColorText, | ||||
|                                             {top: -70, containerBackgroundColor: 'transparent'} | ||||
|                                         ]}> | ||||
|                                          {"containerBackgroundColor: 'transparent' + backgroundColor wash"} | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          }, | ||||
|                      }, | ||||
|                      { | ||||
|                          title:  'numberOfLines attribute', | ||||
|                          render: function () { | ||||
|                              return ( | ||||
|                                  <View> | ||||
|                                      <Text numberOfLines={1}> | ||||
|                                          Maximum of one line no matter now much I write here. If I keep writing it{"'"}ll just truncate after one line | ||||
|                                      </Text> | ||||
|                                      <Text numberOfLines={2} style={{marginTop: 20}}> | ||||
|                                          Maximum of two lines no matter now much I write here. If I keep writing it{"'"}ll just truncate after two lines | ||||
|                                      </Text> | ||||
|                                      <Text style={{marginTop: 20}}> | ||||
|                                          No maximum lines specified no matter now much I write here. If I keep writing it{"'"}ll just keep going and going | ||||
|                                      </Text> | ||||
|                                  </View> | ||||
|                              ) | ||||
|                          } | ||||
|                      } ] as RNTSExample[] | ||||
| } as RNTSExampleModule | ||||
							
								
								
									
										240
									
								
								samples/TypeScript/require.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								samples/TypeScript/require.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,240 @@ | ||||
| // Fixture taken from https://github.com/jcingroup/C551608_Roki/blob/master/Work.WebProj/Scripts/src/tsx/m-parm.tsx | ||||
|  | ||||
| import $ = require('jquery'); | ||||
| import React = require('react'); | ||||
| import ReactDOM = require('react-dom'); | ||||
| import Moment = require('moment'); | ||||
| import ReactBootstrap = require("react-bootstrap"); | ||||
| import CommCmpt = require('comm-cmpt'); | ||||
| import CommFunc = require('comm-func'); | ||||
|  | ||||
| namespace Parm { | ||||
|     interface ParamData { | ||||
|         Email?: string; | ||||
|         PurchaseTotal?: number; | ||||
|         HomoiothermyFee?: number; | ||||
|         RefrigerFee?: number; | ||||
|         AccountName?: string; | ||||
|         BankName?: string; | ||||
|         BankCode?: string; | ||||
|         AccountNumber?: string; | ||||
|         Fee?: number; | ||||
|     } | ||||
|     export class GridForm extends React.Component<any, { param?: ParamData }>{ | ||||
|  | ||||
|  | ||||
|         constructor() { | ||||
|  | ||||
|             super(); | ||||
|             this.queryInitData = this.queryInitData.bind(this); | ||||
|             this.handleSubmit = this.handleSubmit.bind(this); | ||||
|             this.componentDidMount = this.componentDidMount.bind(this); | ||||
|             this.setInputValue = this.setInputValue.bind(this); | ||||
|             this.render = this.render.bind(this); | ||||
|             this.state = { | ||||
|                 param: { | ||||
|                     Email: null, | ||||
|                     PurchaseTotal: 0, | ||||
|                     HomoiothermyFee: 0, | ||||
|                     RefrigerFee:0, | ||||
|                     AccountName: null, | ||||
|                     BankName: null, | ||||
|                     BankCode: null, | ||||
|                     AccountNumber: null, | ||||
|                     Fee: 0 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         static defaultProps = { | ||||
|             apiInitPath: gb_approot + 'Active/ParmData/aj_ParamInit', | ||||
|             apiPath: gb_approot + 'api/GetAction/PostParamData' | ||||
|         } | ||||
|         componentDidMount() { | ||||
|             this.queryInitData(); | ||||
|         } | ||||
|         queryInitData() { | ||||
|             CommFunc.jqGet(this.props.apiInitPath, {}) | ||||
|                 .done((data, textStatus, jqXHRdata) => { | ||||
|                     this.setState({ param: data }); | ||||
|                 }) | ||||
|                 .fail((jqXHR, textStatus, errorThrown) => { | ||||
|                     CommFunc.showAjaxError(errorThrown); | ||||
|                 }); | ||||
|         } | ||||
|         handleSubmit(e: React.FormEvent) { | ||||
|  | ||||
|             e.preventDefault(); | ||||
|             CommFunc.jqPost(this.props.apiPath, this.state.param) | ||||
|                 .done((data, textStatus, jqXHRdata) => { | ||||
|                     if (data.result) { | ||||
|                         CommFunc.tosMessage(null, '修改完成', 1); | ||||
|                     } else { | ||||
|                         alert(data.message); | ||||
|                     } | ||||
|                 }) | ||||
|                 .fail((jqXHR, textStatus, errorThrown) => { | ||||
|                     CommFunc.showAjaxError(errorThrown); | ||||
|                 }); | ||||
|             return; | ||||
|         } | ||||
|         handleOnBlur(date) { | ||||
|  | ||||
|         } | ||||
|         setInputValue(name: string, e: React.SyntheticEvent) { | ||||
|             let input: HTMLInputElement = e.target as HTMLInputElement; | ||||
|             let obj = this.state.param; | ||||
|             obj[name] = input.value; | ||||
|             this.setState({ param: obj }); | ||||
|         } | ||||
|         render() { | ||||
|  | ||||
|             var outHtml: JSX.Element = null; | ||||
|  | ||||
|             let param = this.state.param; | ||||
|             let InputDate = CommCmpt.InputDate; | ||||
|  | ||||
|             outHtml = ( | ||||
|                 <div> | ||||
|     <ul className="breadcrumb"> | ||||
|         <li><i className="fa-list-alt"></i> | ||||
|             {this.props.menuName} | ||||
|             </li> | ||||
|         </ul> | ||||
|     <h4 className="title"> {this.props.caption} 基本資料維護</h4> | ||||
|     <form className="form-horizontal" onSubmit={this.handleSubmit}> | ||||
|         <div className="col-xs-12"> | ||||
|             <div className="item-box"> | ||||
|                 {/*--email--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>Email信箱設定</h5> | ||||
|                     </div> | ||||
|                     <div className="alert alert-warning" role="alert"> | ||||
|                         <ol> | ||||
|                             <li>多筆信箱請用「<strong className="text-danger">, </strong>」逗號分開。<br />ex.<strong>user1 @demo.com.tw, user2 @demo.com.tw</strong></li> | ||||
|                             <li>Email 前面可填收件人姓名,用「<strong className="text-danger">: </strong>」冒號分隔姓名和信箱,此項非必要,可省略。<br />ex.<strong>收件人A: user1 @demo.com.tw, 收件人B: user2 @demo.com.tw</strong></li> | ||||
|                             </ol> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-1 control-label">收件信箱</label> | ||||
|                        <div className="col-xs-9"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.Email} | ||||
|                                     onChange={this.setInputValue.bind(this, 'Email') } | ||||
|                                     maxLength={500} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                 {/*--email end--*/} | ||||
|                 {/*--shoppingCost--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>訂單運費設定</h5> | ||||
|                     </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-3 control-label">會員下訂單,當訂單金額少於NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.PurchaseTotal} | ||||
|                                     onChange={this.setInputValue.bind(this, 'PurchaseTotal') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-2 control-label">元時須付常溫運費NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.HomoiothermyFee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'HomoiothermyFee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-2 control-label">元或冷凍(冷藏)運費NT$</label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.RefrigerFee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'RefrigerFee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         <label className="col-xs-1 control-label">元</label> | ||||
|                         </div> | ||||
|  | ||||
|                 {/*--shoppingCost end--*/} | ||||
|                 {/*--Payment--*/} | ||||
|                 <div className="item-title text-center"> | ||||
|                 <h5>付款方式</h5> | ||||
|                     </div> | ||||
|                     <div className="form-group"> | ||||
|                      <label className="col-xs-4 control-label">當付款方式選擇『ATM轉帳』時,銀行帳號資料為: </label> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">戶名: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.AccountName} | ||||
|                                     onChange={this.setInputValue.bind(this, 'AccountName') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">銀行: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.BankName} | ||||
|                                     onChange={this.setInputValue.bind(this, 'BankName') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">代碼: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.BankCode} | ||||
|                                     onChange={this.setInputValue.bind(this, 'BankCode') } | ||||
|                                     maxLength={5} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     <div className="form-group"> | ||||
|                        <label className="col-xs-2 control-label">帳號: </label> | ||||
|                        <div className="col-xs-3"> | ||||
|                                 <input className="form-control" type="text" | ||||
|                                     value={param.AccountNumber} | ||||
|                                     onChange={this.setInputValue.bind(this, 'AccountNumber') } | ||||
|                                     maxLength={16} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                         </div> | ||||
|                     {/*<div className="form-group"> | ||||
|                      <label className="col-xs-4 control-label">當付款方式選擇『貨到付款』時,須加NT$ </label> | ||||
|                        <div className="col-xs-1"> | ||||
|                                 <input className="form-control" type="number" | ||||
|                                     value={param.Fee} | ||||
|                                     onChange={this.setInputValue.bind(this, 'Fee') } | ||||
|                                     min={0} | ||||
|                                     required/> | ||||
|                            </div> | ||||
|                      <label className="control-label">元手續費</label> | ||||
|                         </div>*/} | ||||
|                 {/*--Payment end--*/} | ||||
|                 </div> | ||||
|  | ||||
|  | ||||
|  | ||||
|             <div className="form-action"> | ||||
|                 <div className="col-xs-4 col-xs-offset-5"> | ||||
|                     <button type="submit" className="btn-primary"><i className="fa-check"></i> 儲存</button> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </form> | ||||
|                     </div> | ||||
|             ); | ||||
|  | ||||
|             return outHtml; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| var dom = document.getElementById('page_content'); | ||||
| ReactDOM.render(<Parm.GridForm caption={gb_caption} menuName={gb_menuname} iconClass="fa-list-alt" />, dom); | ||||
							
								
								
									
										863
									
								
								samples/TypeScript/triple-slash-reference.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										863
									
								
								samples/TypeScript/triple-slash-reference.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,863 @@ | ||||
| /// <reference path="../DefinitelyTyped/react/react-global.d.ts" /> | ||||
|  | ||||
| // Fixture taken from https://github.com/RyanCavanaugh/koany/blob/master/koany.tsx | ||||
|  | ||||
| interface Garden { | ||||
| 	colors: Gardens.RockColor[]; | ||||
| 	shapes: Gardens.RockShape[]; | ||||
| } | ||||
|  | ||||
| namespace Gardens { | ||||
| 	export enum RockShape { | ||||
| 		Empty, | ||||
| 		Circle, | ||||
| 		Triangle, | ||||
| 		Square, | ||||
| 		Max | ||||
| 	} | ||||
| 	export const RockShapes = [RockShape.Circle, RockShape.Triangle, RockShape.Square]; | ||||
| 	export const RockShapesAndEmpty = RockShapes.concat(RockShape.Empty); | ||||
|  | ||||
| 	export enum RockColor { | ||||
| 		Empty, | ||||
| 		White, | ||||
| 		Red, | ||||
| 		Black, | ||||
| 		Max | ||||
| 	} | ||||
| 	export const RockColors = [RockColor.White, RockColor.Red, RockColor.Black]; | ||||
| 	export const RockColorsAndEmpty = RockColors.concat(RockColor.Empty); | ||||
|  | ||||
| 	export const Size = 9; | ||||
|  | ||||
| 	// 012 | ||||
| 	// 345 | ||||
| 	// 678 | ||||
| 	export const adjacencies = [ | ||||
| 		[1, 3], [0, 4, 2], [1, 5], | ||||
| 		[0, 4, 6], [3, 1, 7, 5], [2, 4, 8], | ||||
| 		[3, 7], [6, 4, 8], [7, 5] | ||||
| 	]; | ||||
| } | ||||
|  | ||||
| module Koan { | ||||
| 	export enum DescribeContext { | ||||
| 		// every "white stone" is ... | ||||
| 		Singular, | ||||
| 		// all "white stones" are | ||||
| 		Plural, | ||||
| 		// every stone in the top row is "white" | ||||
| 		Adjectival | ||||
| 	} | ||||
|  | ||||
| 	export enum PartType { | ||||
| 		Selector, | ||||
| 		Aspect | ||||
| 	} | ||||
|  | ||||
| 	export enum StateTestResult { | ||||
| 		Fail = 0, | ||||
| 		WeakPass = 1, | ||||
| 		Pass = 2 | ||||
| 	} | ||||
|  | ||||
| 	/// A general format for producing a Statement | ||||
| 	export interface StatementTemplate<T> { | ||||
| 		holes: PartType[]; | ||||
| 		describe(args: T): string; | ||||
| 		test(g: Garden, args: T): StateTestResult; | ||||
| 	} | ||||
|  | ||||
| 	/// A completed rule that can be used to test a Garden | ||||
| 	export interface ProducedStatement<T> { | ||||
| 		test(g: Garden): StateTestResult; | ||||
| 		description: string; | ||||
| 		children: T; | ||||
|  | ||||
| 		hasPassedAndFailed(): boolean; | ||||
| 	} | ||||
|  | ||||
| 	function rnd(max: number) { | ||||
| 		return Math.floor(Math.random() * max); | ||||
| 	} | ||||
|  | ||||
| 	function randomColor(): Gardens.RockColor { | ||||
| 		return Math.floor(Math.random() * (Gardens.RockColor.Max - 1)) + 1 | ||||
| 	} | ||||
|  | ||||
| 	function randomShape(): Gardens.RockShape { | ||||
| 		return Math.floor(Math.random() * (Gardens.RockShape.Max - 1)) + 1 | ||||
| 	} | ||||
|  | ||||
| 	/* New Impl Here */ | ||||
| 	interface SelectorSpec<T> { | ||||
| 		childTypes?: PartType[]; | ||||
| 		precedence: number; | ||||
| 		weight: number; | ||||
| 		test(args: T, g: Garden, index: number): string|number|boolean; | ||||
| 		describe(args: T, context: DescribeContext): string; | ||||
| 		isAllValues(values: Array<string>|Array<number>): boolean; | ||||
| 	} | ||||
|  | ||||
| 	interface ProducedSelector { | ||||
| 		test(g: Garden, index: number): string|number|boolean; | ||||
| 		getDescription(plural: DescribeContext): string; | ||||
| 		seenAllValues(): boolean; | ||||
| 	} | ||||
|  | ||||
| 	export function buildSelector<T>(spec: SelectorSpec<T>, args: T): ProducedSelector { | ||||
| 		let seenResults: { [s: string]: boolean;} = {}; | ||||
| 		return { | ||||
| 			test: (g: Garden, index: number) => { | ||||
| 				var result = spec.test(args, g, index); | ||||
| 				seenResults[result + ''] = true; | ||||
| 				return result; | ||||
| 			}, | ||||
| 			getDescription: (context) => { | ||||
| 				return spec.describe(args, context); | ||||
| 			}, | ||||
| 			seenAllValues: () => { | ||||
| 				return spec.isAllValues(Object.keys(seenResults)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export var SelectorTemplates: Array<SelectorSpec<{}>> = []; | ||||
| 	module LetsMakeSomeSelectors { | ||||
| 		// Is rock | ||||
| 		SelectorTemplates.push({ | ||||
| 			test: (args, g, i) => g.colors[i] !== Gardens.RockColor.Empty, | ||||
| 			describe: (args, context) => { | ||||
| 				switch(context) { | ||||
| 					case DescribeContext.Plural: | ||||
| 						return 'Stones'; | ||||
| 					case DescribeContext.Adjectival: | ||||
| 						return 'not empty'; | ||||
| 					case DescribeContext.Singular: | ||||
| 						return 'Stone'; | ||||
| 				} | ||||
| 			}, | ||||
| 			isAllValues: items => items.length === 2, | ||||
| 			precedence: 0, | ||||
| 			weight: 1 | ||||
| 		}); | ||||
|  | ||||
| 		// Is of a certain color and/or shape | ||||
| 		Gardens.RockColorsAndEmpty.forEach(color => { | ||||
| 			let colorName = Gardens.RockColor[color]; | ||||
| 			let colorWeight = color === Gardens.RockColor.Empty ? 1 : 0.33; | ||||
| 			Gardens.RockShapesAndEmpty.forEach(shape => { | ||||
| 				let shapeName = Gardens.RockShape[shape]; | ||||
| 				let shapeWeight = shape === Gardens.RockShape.Empty ? 1 : 0.33; | ||||
| 				SelectorTemplates.push({ | ||||
| 					test: (args, g, i) => { | ||||
| 						if(color === Gardens.RockColor.Empty) { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								return g.colors[i] === Gardens.RockColor.Empty; | ||||
| 							} else { | ||||
| 								return g.shapes[i] === shape; | ||||
| 							} | ||||
| 						} else { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								return g.colors[i] === color; | ||||
| 							} else { | ||||
| 								return g.shapes[i] === shape && g.colors[i] === color; | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					describe: (args, context) => { | ||||
| 						if(color === Gardens.RockColor.Empty) { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return 'Empty Cells'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'Empty'; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return 'Empty Cell'; | ||||
| 								} | ||||
| 							} else { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return shapeName + 's'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'a ' + shapeName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return shapeName; | ||||
| 								} | ||||
| 							} | ||||
| 						} else { | ||||
| 							if (shape === Gardens.RockShape.Empty) { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return colorName + ' Stones'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return colorName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return colorName + ' Stone'; | ||||
| 								} | ||||
| 							} else { | ||||
| 								switch(context) { | ||||
| 									case DescribeContext.Plural: | ||||
| 										return colorName + ' ' + shapeName + 's'; | ||||
| 									case DescribeContext.Adjectival: | ||||
| 										return 'a ' + colorName + ' ' + shapeName; | ||||
| 									case DescribeContext.Singular: | ||||
| 										return colorName + ' ' + shapeName; | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					}, | ||||
| 					isAllValues: items => items.length === 2, | ||||
| 					precedence: 3, | ||||
| 					weight: (shapeWeight + colorWeight === 2) ? 0.3 : shapeWeight * colorWeight | ||||
| 				}); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		// [?] in the [top|middle|bottom] [row|column] | ||||
| 		[0, 1, 2].forEach(rowCol => { | ||||
| 			[true, false].forEach(isRow => { | ||||
| 				var name = (isRow ? ['top', 'middle', 'bottom'] : ['left', 'middle', 'right'])[rowCol] + ' ' + (isRow ? 'row' : 'column'); | ||||
| 				var spec: SelectorSpec<[ProducedSelector]> = { | ||||
| 					childTypes: [PartType.Selector], | ||||
| 					test: (args, g, i) => { | ||||
| 						var c = isRow ? Math.floor(i / 3) : i % 3; | ||||
| 						if (c === rowCol) { | ||||
| 							return args[0].test(g, i); | ||||
| 						} else { | ||||
| 							return false; | ||||
| 						} | ||||
| 					}, | ||||
| 					describe: (args, plural) => args[0].getDescription(plural) + ' in the ' + name, | ||||
| 					isAllValues: items => items.length === 2, | ||||
| 					precedence: 4, | ||||
| 					weight: 1 / 6 | ||||
| 				}; | ||||
| 				SelectorTemplates.push(spec); | ||||
| 			}); | ||||
| 		}); | ||||
|  | ||||
| 		// [?] next to a [?] | ||||
| 		SelectorTemplates.push({ | ||||
| 			childTypes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (args, g, i) => { | ||||
| 				if (args[0].test(g, i)) { | ||||
| 					return Gardens.adjacencies[i].some(x => !!args[1].test(g, x)); | ||||
| 				} else { | ||||
| 					return false; | ||||
| 				} | ||||
| 			}, | ||||
| 			describe: (args, plural) => { | ||||
| 				return args[0].getDescription(plural) + ' next to a ' + args[1].getDescription(DescribeContext.Singular); | ||||
| 			}, | ||||
| 			isAllValues: items => items.length === 2, | ||||
| 			precedence: 4, | ||||
| 			weight: 1 | ||||
| 		} as SelectorSpec<[ProducedSelector, ProducedSelector]>); | ||||
| 	} | ||||
|  | ||||
| 	export function buildStatement<T>(s: StatementTemplate<T>, args: T): ProducedStatement<T> { | ||||
| 		let hasPassed = false; | ||||
| 		let hasFailed = false; | ||||
|  | ||||
| 		let result: ProducedStatement<T> = { | ||||
| 			children: args, | ||||
| 			description: s.describe(args), | ||||
| 			test: (g) => { | ||||
| 				let r = s.test(g, args); | ||||
| 				if (r === StateTestResult.Pass) { | ||||
| 					hasPassed = true; | ||||
| 				} else if(r === StateTestResult.Fail) { | ||||
| 					hasFailed = true; | ||||
| 				} | ||||
| 				return r; | ||||
| 			}, | ||||
| 			hasPassedAndFailed: () => { | ||||
| 				return hasPassed && hasFailed && (args as any as ProducedSelector[]).every(c => c.seenAllValues()); | ||||
| 			} | ||||
| 		}; | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	export let StatementList: StatementTemplate<any>[] = []; | ||||
| 	module LetsMakeSomeStatements { | ||||
| 		// Every [?] is a [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				let didAnyTests = false; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) { | ||||
| 						if(!args[1].test(g, i)) return StateTestResult.Fail; | ||||
| 						didAnyTests = true; | ||||
| 					} | ||||
| 				} | ||||
| 				return didAnyTests ? StateTestResult.Pass : StateTestResult.WeakPass; | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'Every ' + args[0].getDescription(DescribeContext.Singular) + ' is ' + args[1].getDescription(DescribeContext.Adjectival); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// There is exactly 1 [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				var count = 0; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) count++; | ||||
| 				} | ||||
|  | ||||
| 				return count === 1 ? StateTestResult.Pass : StateTestResult.Fail; | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'There is exactly one ' + args[0].description; | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// There are more [?] than [?] | ||||
| 		StatementList.push({ | ||||
| 			holes: [PartType.Selector, PartType.Selector], | ||||
| 			test: (g: Garden, args: [ProducedSelector, ProducedSelector]) => { | ||||
| 				var p1c = 0, p2c = 0; | ||||
| 				for (var i = 0; i < Gardens.Size; i++) { | ||||
| 					if (args[0].test(g, i)) p1c++; | ||||
| 					if (args[1].test(g, i)) p2c++; | ||||
| 				} | ||||
| 				if(p1c > p2c && p2c > 0) { | ||||
| 					return StateTestResult.Pass; | ||||
| 				} else if(p1c > p2c) { | ||||
| 					return StateTestResult.WeakPass; | ||||
| 				} else { | ||||
| 					return StateTestResult.Fail; | ||||
| 				} | ||||
| 			}, | ||||
| 			describe: args => { | ||||
| 				return 'There are more ' + args[0].descriptionPlural + ' than ' + args[1].descriptionPlural; | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	function randomElementOf<T>(arr: T[]): T { | ||||
| 		if (arr.length === 0) { | ||||
| 			return undefined; | ||||
| 		} else { | ||||
| 			return arr[Math.floor(Math.random() * arr.length)]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	function randomWeightedElementOf<T extends { weight: number }>(arr: T[]): T { | ||||
| 		var totalWeight = arr.reduce((acc, v) => acc + v.weight, 0); | ||||
| 		var rnd = Math.random() * totalWeight; | ||||
| 		for (var i = 0; i < arr.length; i++) { | ||||
| 			rnd -= arr[i].weight; | ||||
| 			if (rnd <= 0) return arr[i]; | ||||
| 		} | ||||
| 		// Got destroyed by floating error, just try again | ||||
| 		return randomWeightedElementOf(arr); | ||||
| 	} | ||||
|  | ||||
| 	export function buildRandomNewSelector(maxPrecedence = 1000000): ProducedSelector { | ||||
| 		var choices = SelectorTemplates; | ||||
|  | ||||
| 		let initial = randomWeightedElementOf(choices.filter(p => p.precedence <= maxPrecedence)); | ||||
| 		// Fill in the holes | ||||
| 		if (initial.childTypes) { | ||||
| 			var fills = initial.childTypes.map(h => { | ||||
| 				if (h === PartType.Selector) { | ||||
| 					return buildRandomNewSelector(initial.precedence - 1); | ||||
| 				} else { | ||||
| 					throw new Error('Only know how to fill Selector holes') | ||||
| 				} | ||||
| 			}); | ||||
| 			return buildSelector(initial, fills); | ||||
| 		} else { | ||||
| 			return buildSelector(initial, []); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function makeEmptyGarden(): Garden { | ||||
| 		var g = {} as Garden; | ||||
| 		g.colors = []; | ||||
| 		g.shapes = []; | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			g.colors.push(Gardens.RockColor.Empty); | ||||
| 			g.shapes.push(Gardens.RockShape.Empty); | ||||
| 		} | ||||
|  | ||||
| 		return g; | ||||
| 	} | ||||
|  | ||||
| 	export function gardenToString(g: Garden): string { | ||||
| 		return g.colors.join('') + g.shapes.join(''); | ||||
| 	} | ||||
|  | ||||
| 	export function makeRandomGarden(): Garden { | ||||
| 		var g = makeEmptyGarden(); | ||||
| 		blitRandomGardenPair(g, g); | ||||
| 		return g; | ||||
| 	} | ||||
|  | ||||
| 	export function cloneGarden(g: Garden): Garden { | ||||
| 		var result: Garden = { | ||||
| 			colors: g.colors.slice(0), | ||||
| 			shapes: g.shapes.slice(0) | ||||
| 		}; | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	export function clearGarden(g: Garden) { | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			g.colors[i] = Gardens.RockColor.Empty; | ||||
| 			g.shapes[i] = Gardens.RockShape.Empty; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function blitRandomGardenPair(g1: Garden, g2: Garden): void { | ||||
| 		let placeCount = 0; | ||||
| 		for (var i = 0; i < Gardens.Size; i++) { | ||||
| 			if (rnd(7) === 0) { | ||||
| 				g1.colors[i] = g2.colors[i] = randomColor(); | ||||
| 				g1.shapes[i] = g2.shapes[i] = randomShape(); | ||||
| 			} else { | ||||
| 				placeCount++; | ||||
| 				g1.colors[i] = g2.colors[i] = Gardens.RockColor.Empty; | ||||
| 				g1.shapes[i] = g2.shapes[i] = Gardens.RockShape.Empty; | ||||
| 			} | ||||
| 		} | ||||
| 		if (placeCount === 0) blitRandomGardenPair(g1, g2); | ||||
| 	} | ||||
|  | ||||
| 	export function blitNumberedGarden(g: Garden, stoneCount: number, n: number): void { | ||||
| 		clearGarden(g); | ||||
|  | ||||
| 		let cellNumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8]; | ||||
| 		for (let i = 0; i < stoneCount; i++) { | ||||
| 			let cellNum = getValue(cellNumbers.length); | ||||
| 			let cell = cellNumbers.splice(cellNum, 1)[0]; | ||||
| 			g.colors[cell] = getValue(3) + 1; | ||||
| 			g.shapes[cell] = getValue(3) + 1; | ||||
| 		} | ||||
|  | ||||
| 		function getValue(max: number) { | ||||
| 			let result = n % max; | ||||
| 			n = (n - result) / max; | ||||
| 			return result; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	export function mutateGarden(g: Garden): void { | ||||
| 		while (true) { | ||||
| 			var op = rnd(5); | ||||
| 			let x = rnd(Gardens.Size); | ||||
| 			let y = rnd(Gardens.Size); | ||||
| 			switch (op) { | ||||
| 				case 0: // Swap two non-identical cells | ||||
| 					if (g.colors[x] !== g.colors[y] || g.shapes[x] !== g.shapes[y]) { | ||||
| 						var tmp: any = g.colors[x]; | ||||
| 						g.colors[x] = g.colors[y]; | ||||
| 						g.colors[y] = tmp; | ||||
| 						tmp = g.shapes[x]; | ||||
| 						g.shapes[x] = g.shapes[y]; | ||||
| 						g.shapes[y] = tmp; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 1: // Add a stone | ||||
| 					if (g.colors[x] === Gardens.RockColor.Empty) { | ||||
| 						g.colors[x] = randomColor(); | ||||
| 						g.shapes[x] = randomShape(); | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 2: // Remove a stone | ||||
| 					if (g.colors.filter(x => x !== Gardens.RockColor.Empty).length === 1) continue; | ||||
|  | ||||
| 					if (g.colors[x] !== Gardens.RockColor.Empty) { | ||||
| 						g.colors[x] = Gardens.RockColor.Empty; | ||||
| 						g.shapes[x] = Gardens.RockShape.Empty; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 3: // Change a color | ||||
| 					let c = randomColor(); | ||||
| 					if (g.colors[x] !== Gardens.RockColor.Empty && g.colors[x] !== c) { | ||||
| 						g.colors[x] = c; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 				case 4: // Change a shape | ||||
| 					let s = randomShape(); | ||||
| 					if (g.shapes[x] !== Gardens.RockShape.Empty && g.shapes[x] !== s) { | ||||
| 						g.shapes[x] = s; | ||||
| 						return; | ||||
| 					} | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class Indexion { | ||||
| 	sizes: number[]; | ||||
| 	constructor(...sizes: number[]) { | ||||
| 		this.sizes = sizes; | ||||
| 	} | ||||
|  | ||||
| 	public getValues(index: number): number[] { | ||||
| 		let result = new Array<number>(this.sizes.length); | ||||
| 		this.fillValues(index, result); | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	public fillValues(index: number, result: number[]): void { | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			result[i] = index % this.sizes[i]; | ||||
| 			index -= result[i]; | ||||
| 			index /= this.sizes[i]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public valuesToIndex(values: number[]): number { | ||||
| 		var result = 0; | ||||
| 		var factor = 1; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			result += values[i] * this.sizes[i] * factor; | ||||
| 			factor *= this.sizes[i]; | ||||
| 		} | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	public getAdjacentIndices(index: number): number[][] { | ||||
| 		var baseline = this.getValues(index); | ||||
| 		var results: number[][] = []; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			if(baseline[i] > 0) { | ||||
| 				baseline[i]--; | ||||
| 				results.push(baseline.slice()); | ||||
| 				baseline[i]++; | ||||
| 			} | ||||
| 			if(baseline[i] < this.sizes[i] - 1) { | ||||
| 				baseline[i]++; | ||||
| 				results.push(baseline.slice()); | ||||
| 				baseline[i]--; | ||||
| 			} | ||||
| 		} | ||||
| 		return results; | ||||
| 	} | ||||
|  | ||||
| 	public distance(index1: number, index2: number): number { | ||||
| 		let delta = 0; | ||||
| 		for (var i = 0; i < this.sizes.length; i++) { | ||||
| 			var a = index1 % this.sizes[i]; | ||||
| 			var b = index2 % this.sizes[i]; | ||||
| 			delta += Math.abs(b - a); | ||||
| 			index1 -= a; | ||||
| 			index2 -= b; | ||||
| 			index1 /= this.sizes[i]; | ||||
| 			index2 /= this.sizes[i]; | ||||
| 		} | ||||
| 		return delta; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| function makeNewExample() { | ||||
| 	while (true) { | ||||
| 		var p1 = Koan.buildSelector(Koan.SelectorTemplates[12], []); | ||||
| 		var p2 = Koan.buildSelector(Koan.SelectorTemplates[14], []); | ||||
| 		var test = Koan.buildStatement(Koan.StatementList[0], [p1, p2]); | ||||
|  | ||||
| 		var examples: Garden[] = []; | ||||
|  | ||||
| 		console.log('Attempt to generate examples for "' + test.description + '"'); | ||||
|  | ||||
| 		var maxGarden = /*(9 * 9) + (9 * 9 * 9 * 8) + */(9 * 9 * 9 * 8 * 9 * 7); | ||||
| 		let g = Koan.makeEmptyGarden(); | ||||
| 		let passCount = 0, failCount = 0; | ||||
| 		let resultLookup: boolean[] = []; | ||||
| 		let lastResult: boolean = undefined; | ||||
| 		for (var i = 0; i < maxGarden; i++) { | ||||
| 			Koan.blitNumberedGarden(g, 3, i); | ||||
| 			let result = test.test(g); | ||||
| 			if(result === Koan.StateTestResult.Pass) { | ||||
| 				resultLookup[i] = true; | ||||
| 				passCount++; | ||||
|  | ||||
| 				if (lastResult !== true && examples.length < 10) examples.push(Koan.cloneGarden(g)); | ||||
| 				lastResult = true; | ||||
| 			} else if (result === Koan.StateTestResult.Fail) { | ||||
| 				resultLookup[i] = false; | ||||
| 				failCount++; | ||||
|  | ||||
| 				if (lastResult !== false && examples.length < 10) examples.push(Koan.cloneGarden(g)); | ||||
| 				lastResult = false; | ||||
| 			} | ||||
|  | ||||
| 			if (examples.length === 10) break; | ||||
| 		} | ||||
|  | ||||
| 		console.log('Rule passes ' + passCount + ' and fails ' + failCount); | ||||
|  | ||||
| 		/* | ||||
| 		if (!test.hasPassedAndFailed()) { | ||||
| 			console.log('Rule has unreachable, contradictory, or tautological clauses'); | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		if (passCount === 0 || failCount === 0) { | ||||
| 			console.log('Rule is always true or always false'); | ||||
| 			continue; | ||||
| 		} | ||||
| 		*/ | ||||
|  | ||||
| 		var h = document.createElement('h2'); | ||||
| 		h.innerText = test.description; | ||||
| 		document.body.appendChild(h); | ||||
|  | ||||
| 		return { test: test, examples: examples }; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| let list: Garden[] = []; | ||||
| let test: Koan.ProducedStatement<any>; | ||||
| window.onload = function() { | ||||
| 	let rule = makeNewExample(); | ||||
| 	let garden = Koan.makeRandomGarden(); | ||||
| 	list = rule.examples; | ||||
| 	test = rule.test; | ||||
|  | ||||
| 	function renderList() { | ||||
| 		function makeGarden(g: Garden, i: number) { | ||||
| 			return <GardenDisplay | ||||
| 				garden={g} | ||||
| 				key={i + Koan.gardenToString(g)} | ||||
| 				test={test} | ||||
| 				leftButton='✗' | ||||
| 				rightButton='✎' | ||||
| 				onLeftButtonClicked={() => { | ||||
| 					console.log(list.indexOf(g)); | ||||
| 					list.splice(list.indexOf(g), 1); | ||||
| 					renderList(); | ||||
| 				}} | ||||
| 				onRightButtonClicked={() => { | ||||
| 					garden = g; | ||||
| 					renderEditor(); | ||||
| 				}} | ||||
| 			/>; | ||||
| 		} | ||||
| 		let gardenList = <div>{list.map(makeGarden)}</div>; | ||||
| 		React.render(gardenList, document.getElementById('results')); | ||||
| 	} | ||||
|  | ||||
| 	let i = 0; | ||||
| 	function renderEditor() { | ||||
| 		i++; | ||||
| 		let editor = <GardenEditor key={i} test={rule.test} garden={garden} onSaveClicked={(garden) => { | ||||
| 			list.push(garden); | ||||
| 			renderList(); | ||||
| 		}} />; | ||||
| 		React.render(editor, document.getElementById('editor')); | ||||
| 	} | ||||
|  | ||||
| 	renderList(); | ||||
| 	renderEditor(); | ||||
| } | ||||
|  | ||||
| function classNames(nameMap: any): string { | ||||
| 	return Object.keys(nameMap).filter(k => nameMap[k]).join(' '); | ||||
| } | ||||
|  | ||||
| interface GardenCellProps extends React.Props<{}> { | ||||
| 	color: Gardens.RockColor; | ||||
| 	shape: Gardens.RockShape; | ||||
| 	index: number; | ||||
|  | ||||
| 	movable?: boolean; | ||||
| 	onEdit?(newColor: Gardens.RockColor, newShape: Gardens.RockShape): void; | ||||
| } | ||||
| interface GardenCellState { | ||||
| 	isDragging?: boolean; | ||||
| } | ||||
| class GardenCell extends React.Component<GardenCellProps, GardenCellState> { | ||||
| 	state: GardenCellState = {}; | ||||
| 	ignoreNextEdit = false; | ||||
|  | ||||
| 	render() { | ||||
| 		var classes = ['cell', 'index_' + this.props.index]; | ||||
|  | ||||
| 		if (this.state.isDragging) { | ||||
| 			// Render as blank | ||||
| 		} else { | ||||
| 			classes.push(Gardens.RockColor[this.props.color], Gardens.RockShape[this.props.shape]); | ||||
| 		} | ||||
|  | ||||
| 		if (this.props.movable) classes.push('movable'); | ||||
| 		let events: React.HTMLAttributes = { | ||||
| 			onDragStart: (e) => { | ||||
| 				this.ignoreNextEdit = false; | ||||
| 				e.dataTransfer.dropEffect = 'copyMove'; | ||||
| 				e.dataTransfer.effectAllowed = 'move'; | ||||
| 				e.dataTransfer.setData('shape', this.props.shape.toString()); | ||||
| 				e.dataTransfer.setData('color', this.props.color.toString()); | ||||
|  | ||||
| 				let drag = document.getElementById(getGardenName(this.props.color, this.props.shape)); | ||||
| 				let xfer: any = (e.nativeEvent as DragEvent).dataTransfer; | ||||
| 				xfer.setDragImage(drag, drag.clientWidth * 0.5, drag.clientHeight * 0.5); | ||||
|  | ||||
| 				this.setState({ isDragging: true }); | ||||
| 			}, | ||||
| 			onDragEnter: (e) => { | ||||
| 				e.dataTransfer.dropEffect = 'move'; | ||||
| 				e.preventDefault(); | ||||
| 			}, | ||||
| 			onDragOver: (e) => { | ||||
| 				e.dataTransfer.dropEffect = 'move'; | ||||
| 				e.preventDefault(); | ||||
| 			}, | ||||
| 			onDragEnd: (e) => { | ||||
| 				this.setState({ isDragging: false }); | ||||
| 				if (!this.ignoreNextEdit) { | ||||
| 					this.props.onEdit && this.props.onEdit(undefined, undefined); | ||||
| 				} | ||||
| 			}, | ||||
| 			draggable: true | ||||
| 		} | ||||
|  | ||||
| 		let handleDrop = (event: React.DragEvent) => { | ||||
| 			if(this.props.onEdit) { | ||||
| 				if (this.state.isDragging) { | ||||
| 					// Dragged to self, don't do anything | ||||
| 					this.ignoreNextEdit = true; | ||||
| 				} else { | ||||
| 					let shape: Gardens.RockShape = +event.dataTransfer.getData('shape'); | ||||
| 					let color: Gardens.RockColor = +event.dataTransfer.getData('color'); | ||||
| 					this.props.onEdit(color, shape); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return <span className={classes.join(' ')} onDrop={handleDrop} {...this.props.movable ? events : {}} />; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface GardenDisplayProps extends React.Props<GardenDisplay> { | ||||
| 	garden?: Garden; | ||||
| 	test?: Koan.ProducedStatement<any>; | ||||
|  | ||||
| 	leftButton?: string; | ||||
| 	rightButton?: string; | ||||
| 	onLeftButtonClicked?(): void; | ||||
| 	onRightButtonClicked?(): void; | ||||
|  | ||||
| 	editable?: boolean; | ||||
| 	onChanged?(newGarden: Garden): void; | ||||
| } | ||||
| interface GardenDisplayState { | ||||
| 	garden?: Garden; | ||||
| } | ||||
| class GardenDisplay extends React.Component<GardenDisplayProps, GardenDisplayState> { | ||||
| 	state = { | ||||
| 		garden: Koan.cloneGarden(this.props.garden) | ||||
| 	}; | ||||
|  | ||||
| 	leftClicked = () => { | ||||
| 		this.props.onLeftButtonClicked && this.props.onLeftButtonClicked(); | ||||
| 	}; | ||||
|  | ||||
| 	rightClicked = () => { | ||||
| 		this.props.onRightButtonClicked && this.props.onRightButtonClicked(); | ||||
| 	}; | ||||
|  | ||||
| 	render() { | ||||
| 		let g = this.state.garden; | ||||
| 		let pass = (this.props.test && this.props.test.test(this.state.garden)); | ||||
|  | ||||
| 		let classes = { | ||||
| 			garden: true, | ||||
| 			unknown: pass === undefined, | ||||
| 			pass: pass === Koan.StateTestResult.Pass || pass === Koan.StateTestResult.WeakPass, | ||||
| 			fail: pass === Koan.StateTestResult.Fail, | ||||
| 			editable: this.props.editable | ||||
| 		}; | ||||
|  | ||||
| 		var children = g.colors.map((_, i) => ( | ||||
| 			<GardenCell | ||||
| 				key={i} | ||||
| 				color={g.colors[i]} | ||||
| 				shape={g.shapes[i]} | ||||
| 				index={i} | ||||
| 				movable={this.props.editable} | ||||
| 				onEdit={(newColor, newShape) => { | ||||
| 					if(this.props.editable) { | ||||
| 						let newGarden = Koan.cloneGarden(this.state.garden); | ||||
| 						newGarden.colors[i] = newColor; | ||||
| 						newGarden.shapes[i] = newShape; | ||||
| 						this.setState({ garden: newGarden }); | ||||
| 						this.props.onChanged && this.props.onChanged(newGarden); | ||||
| 					} | ||||
| 				}} | ||||
| 			/>)); | ||||
|  | ||||
| 		return <div className="gardenDisplay"> | ||||
| 			<div className={classNames(classes)}>{children}</div> | ||||
| 			<span className="infoRow"> | ||||
| 				{this.props.leftButton && <div className="button left" onClick={this.leftClicked}>{this.props.leftButton}</div>} | ||||
| 				<div className={"passfail " + (pass ? 'pass' : 'fail')}>{pass ? '✓' : '🚫'}</div> | ||||
| 				{this.props.rightButton && <div className="button right" onClick={this.rightClicked}>{this.props.rightButton}</div>} | ||||
| 			</span> | ||||
| 		</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface GardenEditorProps extends React.Props<GardenEditor> { | ||||
| 	onSaveClicked?(garden: Garden): void; | ||||
| 	test?: Koan.ProducedStatement<any>; | ||||
| 	garden?: Garden; | ||||
| } | ||||
| interface GardenEditorState { | ||||
| 	garden?: Garden; | ||||
| 	pass?: boolean; | ||||
| } | ||||
| class GardenEditor extends React.Component<GardenEditorProps, {}> { | ||||
| 	state = { garden: this.props.garden }; | ||||
|  | ||||
| 	save = () => { | ||||
| 		this.props.onSaveClicked && this.props.onSaveClicked(this.state.garden); | ||||
| 	}; | ||||
|  | ||||
| 	render() { | ||||
| 		return <div className="editor"> | ||||
| 			<GardenDisplay garden={this.state.garden} test={this.props.test} editable onChanged={g => this.setState({ garden: g }) } /> | ||||
| 			<StonePalette /> | ||||
| 			<div className="button save" onClick={this.save}>{'💾'}</div> | ||||
| 		</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class StonePalette extends React.Component<{}, {}> { | ||||
| 	render() { | ||||
| 		let items: JSX.Element[] = []; | ||||
| 		Gardens.RockColors.forEach(color => { | ||||
| 			Gardens.RockShapes.forEach(shape => { | ||||
| 				let name = getGardenName(color, shape); | ||||
| 				let extraProps = { id: name, key: name }; | ||||
| 				let index = items.length; | ||||
| 				items.push(<GardenCell | ||||
| 					color={color} | ||||
| 					shape={shape} | ||||
| 					index={index} | ||||
| 					movable | ||||
| 					{...extraProps} />) | ||||
| 			}); | ||||
| 		}); | ||||
| 		return <div className="palette">{items}</div>; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function getGardenName(color: Gardens.RockColor, shape: Gardens.RockShape) { | ||||
| 	return 'draggable.' + Gardens.RockShape[shape] + '.' + Gardens.RockColor[color]; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -1,27 +0,0 @@ | ||||
| //@jsx: preserve | ||||
| //@module: amd | ||||
|  | ||||
| //@filename: react.d.ts | ||||
| declare module JSX { | ||||
| 	interface Element { } | ||||
| 	interface IntrinsicElements { | ||||
| 	} | ||||
| 	interface ElementAttributesProperty { | ||||
| 		props; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| interface Props {   | ||||
|   foo: string; | ||||
| } | ||||
|  | ||||
| //@filename: file.tsx | ||||
| export class MyComponent {   | ||||
|   render() { | ||||
|   } | ||||
|  | ||||
|   props: { foo: string; } | ||||
| } | ||||
|  | ||||
| <MyComponent foo="bar" />; // ok   | ||||
| <MyComponent foo={0} />; // should be an error | ||||
							
								
								
									
										1297
									
								
								samples/XCompose/filenames/XCompose
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1297
									
								
								samples/XCompose/filenames/XCompose
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										25
									
								
								samples/XML/wixdemo.wixproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								samples/XML/wixdemo.wixproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
| 	<PropertyGroup> | ||||
| 			<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||||
| 			<Platform Condition=" '$(Platform)' == '' ">x86</Platform> | ||||
| 			<ProductVersion>3.0</ProductVersion> | ||||
| 			<ProjectGuid>{c523055d-a9d0-4318-ae85-ec934d33204b}</ProjectGuid> | ||||
| 			<SchemaVersion>2.0</SchemaVersion> | ||||
| 			<OutputName>WixProject1</OutputName> | ||||
| 			<OutputType>Package</OutputType> | ||||
| 			<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v[[Version.Major]].x\Wix.targets</WixTargetsPath> | ||||
| 	</PropertyGroup> | ||||
| 	<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> | ||||
| 			<OutputPath>bin\$(Configuration)\</OutputPath> | ||||
| 			<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> | ||||
| 			<DefineConstants>Debug</DefineConstants> | ||||
| 	</PropertyGroup> | ||||
| 	<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> | ||||
| 			<OutputPath>bin\$(Configuration)\</OutputPath> | ||||
| 			<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath> | ||||
| 	</PropertyGroup> | ||||
| 	<ItemGroup> | ||||
| 			<Compile Include="Product.wxs" /> | ||||
| 	</ItemGroup> | ||||
| 	<Import Project="$(WixTargetsPath)" /> | ||||
| </Project> | ||||
							
								
								
									
										42
									
								
								samples/YAML/database.yml.mysql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								samples/YAML/database.yml.mysql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # | ||||
| # PRODUCTION | ||||
| # | ||||
| production: | ||||
|   adapter: mysql2 | ||||
|   encoding: utf8mb4 | ||||
|   collation: utf8mb4_general_ci | ||||
|   reconnect: false | ||||
|   database: gitlabhq_production | ||||
|   pool: 10 | ||||
|   username: git | ||||
|   password: "secure password" | ||||
|   # host: localhost | ||||
|   # socket: /tmp/mysql.sock | ||||
|  | ||||
| # | ||||
| # Development specific | ||||
| # | ||||
| development: | ||||
|   adapter: mysql2 | ||||
|   encoding: utf8mb4 | ||||
|   collation: utf8mb4_general_ci | ||||
|   reconnect: false | ||||
|   database: gitlabhq_development | ||||
|   pool: 5 | ||||
|   username: root | ||||
|   password: "secure password" | ||||
|   # socket: /tmp/mysql.sock | ||||
|  | ||||
| # Warning: The database defined as "test" will be erased and | ||||
| # re-generated from your development database when you run "rake". | ||||
| # Do not set this db to the same as development or production. | ||||
| test: &test | ||||
|   adapter: mysql2 | ||||
|   encoding: utf8mb4 | ||||
|   collation: utf8mb4_general_ci | ||||
|   reconnect: false | ||||
|   database: gitlabhq_test | ||||
|   pool: 5 | ||||
|   username: root | ||||
|   password: | ||||
|   # socket: /tmp/mysql.sock | ||||
| @@ -84,6 +84,7 @@ if repo_old | ||||
|   log "Deregistering: #{repo_old}" | ||||
|   `git submodule deinit #{repo_old}` | ||||
|   `git rm -rf #{repo_old}` | ||||
|   `script/convert-grammars` | ||||
| end | ||||
|  | ||||
| log "Registering new submodule: #{repo_new}" | ||||
| @@ -92,7 +93,11 @@ exit 1 if $?.exitstatus > 0 | ||||
| `script/convert-grammars --add #{repo_new}` | ||||
|  | ||||
| log "Confirming license" | ||||
| `script/licensed --module "#{repo_new}"` | ||||
| if repo_old | ||||
|   `script/licensed` | ||||
| else | ||||
|   `script/licensed --module "#{repo_new}"` | ||||
| end | ||||
|  | ||||
| log "Updating grammar documentation in vendor/REAEDME.md" | ||||
| `bundle exec rake samples` | ||||
|   | ||||
| @@ -174,6 +174,7 @@ end | ||||
| def load_grammars(tmp_dir, source, all_scopes) | ||||
|   is_url = source.start_with?("http:", "https:") | ||||
|   return [] if is_url && !$options[:remote] | ||||
|   return [] if !is_url && !File.exist?(source) | ||||
|  | ||||
|   p = if !is_url | ||||
|         if File.directory?(source) | ||||
|   | ||||
| @@ -51,7 +51,7 @@ SUBMODULES.partition { |submodule| SLOW_SUBMODULES.include?(submodule) }.flatten | ||||
|   submodules.push(submodule) | ||||
| end | ||||
|  | ||||
| 8.times do | ||||
| (ARGV.first || 8).to_i.times do | ||||
|   Thread.new { run_thread(submodules, results) } | ||||
| end | ||||
|  | ||||
|   | ||||
| @@ -71,7 +71,7 @@ class GrammarList | ||||
|       when "https://bitbucket.org/Clams/sublimesystemverilog/get/default.tar.gz" | ||||
|         short_url = "bitbucket:Clams/sublimesystemverilog" | ||||
|         long_url  = "https://bitbucket.org/Clams/sublimesystemverilog" | ||||
|       when "http://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage" | ||||
|       when "https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage" | ||||
|         short_url = "genshi.edgewall.org/query" | ||||
|         long_url  = "https://genshi.edgewall.org/query" | ||||
|       when "vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage" | ||||
|   | ||||
							
								
								
									
										9
									
								
								test/fixtures/Data/yarn.lock
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								test/fixtures/Data/yarn.lock
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. | ||||
| # yarn lockfile v1 | ||||
| abab@^1.0.0: | ||||
|   version "1.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" | ||||
|  | ||||
| abbrev@1, abbrev@1.0.x: | ||||
|   version "1.0.9" | ||||
|   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" | ||||
| @@ -187,6 +187,9 @@ class TestBlob < Minitest::Test | ||||
|     assert sample_blob_memory("JavaScript/intro.js").generated? | ||||
|     assert sample_blob_memory("JavaScript/classes.js").generated? | ||||
|  | ||||
|     assert sample_blob_memory("JavaScript/ccalc-lex.js").generated? | ||||
|     assert sample_blob_memory("JavaScript/ccalc-parse.js").generated? | ||||
|  | ||||
|     # Protocol Buffer generated code | ||||
|     assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? | ||||
|     assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? | ||||
| @@ -194,6 +197,7 @@ class TestBlob < Minitest::Test | ||||
|     assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? | ||||
|     assert sample_blob_memory("Go/api.pb.go").generated? | ||||
|     assert sample_blob_memory("Go/embedded.go").generated? | ||||
|     assert sample_blob_memory("JavaScript/proto.js").generated? | ||||
|  | ||||
|     # Apache Thrift generated code | ||||
|     assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? | ||||
|   | ||||
| @@ -53,4 +53,8 @@ class TestClassifier < Minitest::Test | ||||
|       assert_equal language.name, results.first[0], "#{sample[:path]}\n#{results.inspect}" | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def test_classify_empty_languages | ||||
|     assert_equal [], Classifier.classify(Samples.cache, fixture("Ruby/foo.rb"), []) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -79,6 +79,9 @@ class TestGenerated < Minitest::Test | ||||
|     generated_fixture_loading_data("Data/sourcemap.v3.map") | ||||
|     generated_fixture_loading_data("Data/sourcemap.v1.map") | ||||
|  | ||||
|     # Yarn locfile | ||||
|     generated_fixture_loading_data("Data/yarn.lock") | ||||
|  | ||||
|     # Specflow | ||||
|     generated_fixture_without_loading_data("Features/BindingCulture.feature.cs") | ||||
|  | ||||
| @@ -87,5 +90,8 @@ class TestGenerated < Minitest::Test | ||||
|  | ||||
|     # GrammarKit | ||||
|     generated_sample_loading_data("Java/GrammarKit.java") | ||||
|  | ||||
|     # roxygen2 | ||||
|     generated_sample_loading_data("R/import.Rd") | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -13,34 +13,37 @@ class TestGrammars < Minitest::Test | ||||
|   HASH_WHITELIST = [ | ||||
|     "bc12b3b4917eab9aedb87ec1305c2a4376e34fd1", # TextMate bundles | ||||
|     "16c4748566b3dd996594af0410a1875b22d3a2b3", # language-yaml and atom-salt | ||||
|     "ebae2d87e06d3acef075d049fcfc8958c0364863", # go-tmbundle | ||||
|     "ff21db2554d69d78b2220db5615b16bbba0788d3", # factor | ||||
|     "b9a7428fd036eed8503995e06e989180c276b17d", # jflex.tmbundle | ||||
|     "b4381ebae3235e91aaf5ccab1e8e94e9ad4faef4", # jflex.tmbundle | ||||
|     "da39a3ee5e6b4b0d3255bfef95601890afd80709", # SCSS.tmbundle | ||||
|     "5f772ff20ddf3dbac1ec9b6a98c5aa50ace555b2", # gradle.tmbundle | ||||
|     "b5432a1e1055de7eeede2dddf91e009480651fd6", # jasmin-sublime | ||||
|     "74143c4d2a5649eb179105afcb37f466558c22ce", # language-clojure | ||||
|     "760471435f5ab0b9dc99a628203cd8f9156d28ce", # language-coffee-script | ||||
|     "330e6d465e26bdd232aafcd3f5dba6a1d098a20e", # language-csharp | ||||
|     "170b35df61879139b88379a8f1bfd86289c13599", # language-clojure | ||||
|     "60e1fe192238a032341d5dd3cd80535459fc84e4", # language-coffee-script | ||||
|     "94fbd554ec1837fb7c508fd7425326639c3f4103", # language-csharp | ||||
|     "70fb557a431891c2d634c33fa7367feab5066fd6", # language-javascript | ||||
|     "e0528c23cd967f999e058f1408ccb5b7237daaba", # language-python | ||||
|     "8653305b358375d0fced85dc24793b99919b11ef", # language-shellscript | ||||
|     "9f0c0b0926a18f5038e455e8df60221125fc3111", # elixir-tmbundle | ||||
|     "90af581219debd4e90ef041b46c294e8b4ae6d14", # mako-tmbundle | ||||
|     "a4dadb2374282098c5b8b14df308906f5347d79a", # mako-tmbundle | ||||
|     "b9b24778619dce325b651f0d77cbc72e7ae0b0a3", # Julia.tmbundle | ||||
|     "e06722add999e7428048abcc067cd85f1f7ca71c", # r.tmbundle | ||||
|     "50b14a0e3f03d7ca754dac42ffb33302b5882b78", # smalltalk-tmbundle | ||||
|     "eafbc4a2f283752858e6908907f3c0c90188785b", # gap-tmbundle | ||||
|     "1faa3a44cac6070f22384332434af37dfaaf2f70", # Stylus | ||||
|     "22b3bf41b9e3e8c22357ee12265f149d68aae60a", # Stylus | ||||
|     "c87e7e574fca543941650e5b0a144b44c02c55d8", # language-crystal | ||||
|     "c78ec142ac3126cf639cfd67bd646ed8226d8b74", # atom-language-purescript | ||||
|     "341d7f66806fc41d081133d6e51ade856352e056", # FreeMarker.tmbundle | ||||
|     "ace112feb693358db2970d0805f6894b745e14b5", # atom-language-purescript | ||||
|     "a626362e3efd030c1d97c0faf422cf8c2dfaea54", # FreeMarker.tmbundle | ||||
|     "15a394f6bc43400946570b299aee8ae264a1e3ff", # language-renpy | ||||
|     "c9118c370411f2f049c746c0fd096554e877aea2", # perl6fe | ||||
|     "8ccf886749c32fb7e65d4d1316a7ed0479c93dc9", # language-less | ||||
|     "74bb588102e8f332970a0fcabe36299e0806f130", # language-less | ||||
|     "2f03492b52d7dd83b4e7472f01b87c6121e5b1a4", # monkey | ||||
|     "241e5ddbb4423d792216783e9f668bd670b026e4", # ant.tmbundle | ||||
|     "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493"  # language-blade | ||||
|     "784da5ce445892bc3e26beeb6a4402bbc5ca997e", # ant.tmbundle | ||||
|     "bdab9fdc21e6790b479ccb5945b78bc0f6ce2493", # language-blade | ||||
|     "c9118c370411f2f049c746c0fd096554e877aea2", # atom-language-perl6 | ||||
|     "15a502335012f27f8a5991139298edb87a6e467d", # atom-language-rust | ||||
|     "304be6184f7f344d44a1d13bddf511019624fd22", # language-css | ||||
|     "8c538244ba88ef9902a4faf11a2b9acec46f2a4e", # sublime-nginx | ||||
|     "82c356d6ecb143a8a20e1658b0d6a2d77ea8126f", # idl.tmbundle | ||||
|     "9dafd4e2a79cb13a6793b93877a254bc4d351e74", # sublime-text-ox | ||||
|     "8e111741d97ba2e27b3d18a309d426b4a37e604f", # sublime-varnish | ||||
|   ].freeze | ||||
|  | ||||
|   # List of allowed SPDX license names | ||||
|   | ||||
| @@ -264,4 +264,11 @@ class TestHeuristcs < Minitest::Test | ||||
|       "XML" => all_fixtures("XML", "*.ts") | ||||
|     }) | ||||
|   end | ||||
|  | ||||
|   def test_tsx_by_heuristics | ||||
|     assert_heuristics({ | ||||
|       "TypeScript" => all_fixtures("TypeScript", "*.tsx"), | ||||
|       "XML" => all_fixtures("XML", "*.tsx") | ||||
|     }) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -460,4 +460,8 @@ class TestLanguage < Minitest::Test | ||||
|       assert !language.color, "Unused colour assigned to #{language.name}" | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def test_non_crash_on_comma | ||||
|     assert_nil Language[','] | ||||
|   end | ||||
| end | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/CodeMirror
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/CodeMirror updated: 900659feeb...c96aae3d94
									
								
							
							
								
								
									
										40
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/README.md
									
									
									
									
										vendored
									
									
								
							| @@ -76,8 +76,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Csound:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound) | ||||
| - **Csound Document:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound) | ||||
| - **Csound Score:** [nwhetsell/language-csound](https://github.com/nwhetsell/language-csound) | ||||
| - **CSS:** [textmate/css.tmbundle](https://github.com/textmate/css.tmbundle) | ||||
| - **Cucumber:** [cucumber/cucumber-tmbundle](https://github.com/cucumber/cucumber-tmbundle) | ||||
| - **CSS:** [atom/language-css](https://github.com/atom/language-css) | ||||
| - **Cuda:** [harrism/sublimetext-cuda-cpp](https://github.com/harrism/sublimetext-cuda-cpp) | ||||
| - **Cycript:** [atom/language-javascript](https://github.com/atom/language-javascript) | ||||
| - **Cython:** [textmate/cython.tmbundle](https://github.com/textmate/cython.tmbundle) | ||||
| @@ -109,13 +108,12 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Fancy:** [fancy-lang/fancy-tmbundle](https://github.com/fancy-lang/fancy-tmbundle) | ||||
| - **fish:** [l15n/fish-tmbundle](https://github.com/l15n/fish-tmbundle) | ||||
| - **Forth:** [textmate/forth.tmbundle](https://github.com/textmate/forth.tmbundle) | ||||
| - **FORTRAN:** [textmate/fortran.tmbundle](https://github.com/textmate/fortran.tmbundle) | ||||
| - **Fortran:** [textmate/fortran.tmbundle](https://github.com/textmate/fortran.tmbundle) | ||||
| - **FreeMarker:** [freemarker/FreeMarker.tmbundle](https://github.com/freemarker/FreeMarker.tmbundle) | ||||
| - **Frege:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell) | ||||
| - **G-code:** [robotmaster/sublime-text-syntax-highlighting](https://github.com/robotmaster/sublime-text-syntax-highlighting) | ||||
| - **Game Maker Language:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **GAP:** [dhowden/gap-tmbundle](https://github.com/dhowden/gap-tmbundle) | ||||
| - **GAS:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly) | ||||
| - **GCC Machine Description:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) | ||||
| - **GDB:** [quarnster/SublimeGDB](https://github.com/quarnster/SublimeGDB) | ||||
| - **GDScript:** [beefsack/GDScript-sublime](https://github.com/beefsack/GDScript-sublime) | ||||
| @@ -123,6 +121,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Gentoo Ebuild:** [atom/language-shellscript](https://github.com/atom/language-shellscript) | ||||
| - **Gentoo Eclass:** [atom/language-shellscript](https://github.com/atom/language-shellscript) | ||||
| - **Gettext Catalog:** [textmate/gettext.tmbundle](https://github.com/textmate/gettext.tmbundle) | ||||
| - **Gherkin:** [cucumber/cucumber-tmbundle](https://github.com/cucumber/cucumber-tmbundle) | ||||
| - **GLSL:** [euler0/sublime-glsl](https://github.com/euler0/sublime-glsl) | ||||
| - **Glyph:** [textmate/tcl.tmbundle](https://github.com/textmate/tcl.tmbundle) | ||||
| - **GN:** [devoncarew/language-gn](https://github.com/devoncarew/language-gn) | ||||
| @@ -135,24 +134,23 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Grammatical Framework:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell) | ||||
| - **GraphQL:** [rmosolgo/language-graphql](https://github.com/rmosolgo/language-graphql) | ||||
| - **Graphviz (DOT):** [textmate/graphviz.tmbundle](https://github.com/textmate/graphviz.tmbundle) | ||||
| - **Groff:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff) | ||||
| - **Groovy:** [textmate/groovy.tmbundle](https://github.com/textmate/groovy.tmbundle) | ||||
| - **Groovy Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle) | ||||
| - **Hack:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **Hack:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **Haml:** [ezekg/language-haml](https://github.com/ezekg/language-haml) | ||||
| - **Handlebars:** [daaain/Handlebars](https://github.com/daaain/Handlebars) | ||||
| - **Harbour:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour) | ||||
| - **Haskell:** [atom-haskell/language-haskell](https://github.com/atom-haskell/language-haskell) | ||||
| - **Haxe:** [clemos/haxe-sublime-bundle](https://github.com/clemos/haxe-sublime-bundle) | ||||
| - **HCL:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **HCL:** [alexlouden/Terraform.tmLanguage](https://github.com/alexlouden/Terraform.tmLanguage) | ||||
| - **HLSL:** [tgjones/shaders-tmLanguage](https://github.com/tgjones/shaders-tmLanguage) | ||||
| - **HTML:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle) | ||||
| - **HTML+Django:** [textmate/python-django.tmbundle](https://github.com/textmate/python-django.tmbundle) | ||||
| - **HTML+ECR:** [atom-crystal/language-crystal](https://github.com/atom-crystal/language-crystal) | ||||
| - **HTML+EEX:** [elixir-lang/elixir-tmbundle](https://github.com/elixir-lang/elixir-tmbundle) | ||||
| - **HTML+ERB:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **HTML+PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **HTML+PHP:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **HTTP:** [httpspec/sublime-highlighting](https://github.com/httpspec/sublime-highlighting) | ||||
| - **Hy:** [rwtolbert/language-hy](https://github.com/rwtolbert/language-hy) | ||||
| - **IDL:** [mgalloy/idl.tmbundle](https://github.com/mgalloy/idl.tmbundle) | ||||
| - **Idris:** [idris-hackers/idris-sublime](https://github.com/idris-hackers/idris-sublime) | ||||
| - **Inform 7:** [erkyrath/language-inform7](https://github.com/erkyrath/language-inform7) | ||||
| @@ -162,7 +160,6 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Isabelle:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle) | ||||
| - **Isabelle ROOT:** [lsf37/Isabelle.tmbundle](https://github.com/lsf37/Isabelle.tmbundle) | ||||
| - **J:** [bcj/JSyntax](https://github.com/bcj/JSyntax) | ||||
| - **Jade:** [davidrios/jade-tmbundle](https://github.com/davidrios/jade-tmbundle) | ||||
| - **Jasmin:** [atmarksharp/jasmin-sublime](https://github.com/atmarksharp/jasmin-sublime) | ||||
| - **Java:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle) | ||||
| - **Java Server Pages:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle) | ||||
| @@ -173,7 +170,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **JSONiq:** [wcandillon/language-jsoniq](https://github.com/wcandillon/language-jsoniq) | ||||
| - **JSONLD:** [atom/language-javascript](https://github.com/atom/language-javascript) | ||||
| - **JSX:** [github-linguist/language-babel](https://github.com/github-linguist/language-babel) | ||||
| - **Julia:** [nanoant/Julia.tmbundle](https://github.com/nanoant/Julia.tmbundle) | ||||
| - **Julia:** [JuliaEditorSupport/Julia.tmbundle](https://github.com/JuliaEditorSupport/Julia.tmbundle) | ||||
| - **Jupyter Notebook:** [textmate/json.tmbundle](https://github.com/textmate/json.tmbundle) | ||||
| - **Kit:** [textmate/html.tmbundle](https://github.com/textmate/html.tmbundle) | ||||
| - **Kotlin:** [vkostyukov/kotlin-sublime-package](https://github.com/vkostyukov/kotlin-sublime-package) | ||||
| @@ -198,6 +195,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Makefile:** [textmate/make.tmbundle](https://github.com/textmate/make.tmbundle) | ||||
| - **Mako:** [marconi/mako-tmbundle](https://github.com/marconi/mako-tmbundle) | ||||
| - **Markdown:** [atom/language-gfm](https://github.com/atom/language-gfm) | ||||
| - **Marko:** [marko-js/marko-tmbundle](https://github.com/marko-js/marko-tmbundle) | ||||
| - **Mask:** [tenbits/sublime-mask](https://github.com/tenbits/sublime-mask) | ||||
| - **Mathematica:** [shadanan/mathematica-tmbundle](https://github.com/shadanan/mathematica-tmbundle) | ||||
| - **Matlab:** [textmate/matlab.tmbundle](https://github.com/textmate/matlab.tmbundle) | ||||
| @@ -206,6 +204,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **MAXScript:** [Alhadis/language-maxscript](https://github.com/Alhadis/language-maxscript) | ||||
| - **MediaWiki:** [textmate/mediawiki.tmbundle](https://github.com/textmate/mediawiki.tmbundle) | ||||
| - **Mercury:** [sebgod/mercury-tmlanguage](https://github.com/sebgod/mercury-tmlanguage) | ||||
| - **Meson:** [TingPing/language-meson](https://github.com/TingPing/language-meson) | ||||
| - **Metal:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **Mirah:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **Modelica:** [BorisChumichev/modelicaSublimeTextPackage](https://github.com/BorisChumichev/modelicaSublimeTextPackage) | ||||
| @@ -224,7 +223,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **NetLogo:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) | ||||
| - **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) | ||||
| - **Nginx:** [brandonwamboldt/sublime-nginx](https://github.com/brandonwamboldt/sublime-nginx) | ||||
| - **Nimrod:** [Varriount/NimLime](https://github.com/Varriount/NimLime) | ||||
| - **Nim:** [Varriount/NimLime](https://github.com/Varriount/NimLime) | ||||
| - **Ninja:** [khyo/language-ninja](https://github.com/khyo/language-ninja) | ||||
| - **Nit:** [R4PaSs/Sublime-Nit](https://github.com/R4PaSs/Sublime-Nit) | ||||
| - **Nix:** [wmertens/sublime-nix](https://github.com/wmertens/sublime-nix) | ||||
| @@ -241,16 +240,18 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **OpenCL:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **OpenEdge ABL:** [jfairbank/Sublime-Text-2-OpenEdge-ABL](https://github.com/jfairbank/Sublime-Text-2-OpenEdge-ABL) | ||||
| - **OpenRC runscript:** [atom/language-shellscript](https://github.com/atom/language-shellscript) | ||||
| - **OpenSCAD:** [tbuser/openscad.tmbundle](https://github.com/tbuser/openscad.tmbundle) | ||||
| - **OpenType Feature File:** [Alhadis/language-fontforge](https://github.com/Alhadis/language-fontforge) | ||||
| - **Ox:** [andreashetland/sublime-text-ox](https://github.com/andreashetland/sublime-text-ox) | ||||
| - **Oz:** [eregon/oz-tmbundle](https://github.com/eregon/oz-tmbundle) | ||||
| - **P4:** [TakeshiTseng/atom-language-p4](https://github.com/TakeshiTseng/atom-language-p4) | ||||
| - **Papyrus:** [Kapiainen/SublimePapyrus](https://github.com/Kapiainen/SublimePapyrus) | ||||
| - **Parrot Internal Representation:** [textmate/parrot.tmbundle](https://github.com/textmate/parrot.tmbundle) | ||||
| - **Pascal:** [textmate/pascal.tmbundle](https://github.com/textmate/pascal.tmbundle) | ||||
| - **PAWN:** [Southclaw/pawn-sublime-language](https://github.com/Southclaw/pawn-sublime-language) | ||||
| - **Perl:** [textmate/perl.tmbundle](https://github.com/textmate/perl.tmbundle) | ||||
| - **Perl6:** [MadcapJake/language-perl6fe](https://github.com/MadcapJake/language-perl6fe) | ||||
| - **PHP:** [textmate/php.tmbundle](https://github.com/textmate/php.tmbundle) | ||||
| - **Perl6:** [perl6/atom-language-perl6](https://github.com/perl6/atom-language-perl6) | ||||
| - **PHP:** [brandonblack/php.tmbundle](https://github.com/brandonblack/php.tmbundle) | ||||
| - **Pic:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff) | ||||
| - **PicoLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) | ||||
| - **PigLatin:** [goblindegook/sublime-text-pig-latin](https://github.com/goblindegook/sublime-text-pig-latin) | ||||
| @@ -265,6 +266,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **Prolog:** [alnkpa/sublimeprolog](https://github.com/alnkpa/sublimeprolog) | ||||
| - **Propeller Spin:** [bitbased/sublime-spintools](https://github.com/bitbased/sublime-spintools) | ||||
| - **Protocol Buffer:** [michaeledgar/protobuf-tmbundle](https://github.com/michaeledgar/protobuf-tmbundle) | ||||
| - **Pug:** [davidrios/jade-tmbundle](https://github.com/davidrios/jade-tmbundle) | ||||
| - **Puppet:** [russCloak/SublimePuppet](https://github.com/russCloak/SublimePuppet) | ||||
| - **PureScript:** [purescript-contrib/atom-language-purescript](https://github.com/purescript-contrib/atom-language-purescript) | ||||
| - **Python:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython) | ||||
| @@ -275,21 +277,25 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **R:** [textmate/r.tmbundle](https://github.com/textmate/r.tmbundle) | ||||
| - **Racket:** [soegaard/racket-highlight-for-github](https://github.com/soegaard/racket-highlight-for-github) | ||||
| - **RAML:** [atom/language-yaml](https://github.com/atom/language-yaml) | ||||
| - **Rascal:** [usethesource/rascal-syntax-highlighting](https://github.com/usethesource/rascal-syntax-highlighting) | ||||
| - **RDoc:** [joshaven/RDoc.tmbundle](https://github.com/joshaven/RDoc.tmbundle) | ||||
| - **REALbasic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax) | ||||
| - **Reason:** [facebook/reason](https://github.com/facebook/reason) | ||||
| - **Rebol:** [Oldes/Sublime-REBOL](https://github.com/Oldes/Sublime-REBOL) | ||||
| - **Red:** [Oldes/Sublime-Red](https://github.com/Oldes/Sublime-Red) | ||||
| - **Regular Expression:** [Alhadis/language-regexp](https://github.com/Alhadis/language-regexp) | ||||
| - **Ren'Py:** [williamd1k0/language-renpy](https://github.com/williamd1k0/language-renpy) | ||||
| - **reStructuredText:** [Lukasa/language-restructuredtext](https://github.com/Lukasa/language-restructuredtext) | ||||
| - **REXX:** [mblocker/rexx-sublime](https://github.com/mblocker/rexx-sublime) | ||||
| - **RHTML:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **RMarkdown:** [atom/language-gfm](https://github.com/atom/language-gfm) | ||||
| - **RobotFramework:** [shellderp/sublime-robot-plugin](https://github.com/shellderp/sublime-robot-plugin) | ||||
| - **Roff:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff) | ||||
| - **Rouge:** [atom/language-clojure](https://github.com/atom/language-clojure) | ||||
| - **RPM Spec:** [waveclaw/language-rpm-spec](https://github.com/waveclaw/language-rpm-spec) | ||||
| - **Ruby:** [aroben/ruby.tmbundle](https://github.com/aroben/ruby.tmbundle) | ||||
| - **RUNOFF:** [Alhadis/language-roff](https://github.com/Alhadis/language-roff) | ||||
| - **Rust:** [jhasse/sublime-rust](https://github.com/jhasse/sublime-rust) | ||||
| - **Rust:** [zargony/atom-language-rust](https://github.com/zargony/atom-language-rust) | ||||
| - **Sage:** [MagicStack/MagicPython](https://github.com/MagicStack/MagicPython) | ||||
| - **SaltStack:** [saltstack/atom-salt](https://github.com/saltstack/atom-salt) | ||||
| - **SAS:** [rpardee/sas.tmbundle](https://github.com/rpardee/sas.tmbundle) | ||||
| @@ -341,6 +347,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **TypeScript:** [Microsoft/TypeScript-Sublime-Plugin](https://github.com/Microsoft/TypeScript-Sublime-Plugin) | ||||
| - **Unified Parallel C:** [textmate/c.tmbundle](https://github.com/textmate/c.tmbundle) | ||||
| - **Unity3D Asset:** [atom/language-yaml](https://github.com/atom/language-yaml) | ||||
| - **Unix Assembly:** [Nessphoro/sublimeassembly](https://github.com/Nessphoro/sublimeassembly) | ||||
| - **Uno:** [atom/language-csharp](https://github.com/atom/language-csharp) | ||||
| - **UnrealScript:** [textmate/java.tmbundle](https://github.com/textmate/java.tmbundle) | ||||
| - **UrWeb:** [gwalborn/UrWeb-Language-Definition](https://github.com/gwalborn/UrWeb-Language-Definition) | ||||
| @@ -348,7 +355,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **VCL:** [brandonwamboldt/sublime-varnish](https://github.com/brandonwamboldt/sublime-varnish) | ||||
| - **Verilog:** [textmate/verilog.tmbundle](https://github.com/textmate/verilog.tmbundle) | ||||
| - **VHDL:** [textmate/vhdl.tmbundle](https://github.com/textmate/vhdl.tmbundle) | ||||
| - **VimL:** [Alhadis/language-viml](https://github.com/Alhadis/language-viml) | ||||
| - **Vim script:** [Alhadis/language-viml](https://github.com/Alhadis/language-viml) | ||||
| - **Visual Basic:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax) | ||||
| - **Volt:** [textmate/d.tmbundle](https://github.com/textmate/d.tmbundle) | ||||
| - **Vue:** [vuejs/vue-syntax-highlight](https://github.com/vuejs/vue-syntax-highlight) | ||||
| @@ -361,6 +368,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting | ||||
| - **X10:** [x10-lang/x10-highlighting](https://github.com/x10-lang/x10-highlighting) | ||||
| - **xBase:** [hernad/atom-language-harbour](https://github.com/hernad/atom-language-harbour) | ||||
| - **XC:** [graymalkin/xc.tmbundle](https://github.com/graymalkin/xc.tmbundle) | ||||
| - **XCompose:** [samcv/language-xcompose](https://github.com/samcv/language-xcompose) | ||||
| - **XML:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle) | ||||
| - **Xojo:** [angryant0007/VBDotNetSyntax](https://github.com/angryant0007/VBDotNetSyntax) | ||||
| - **XProc:** [textmate/xml.tmbundle](https://github.com/textmate/xml.tmbundle) | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/grammars/ColdFusion
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/ColdFusion
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/ColdFusion updated: c54a4c5f5e...dbe2f76038
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/Elm
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Elm
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Elm updated: 8e8af4a712...64315b1f86
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/Handlebars
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Handlebars
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Handlebars updated: ed851e0c67...63c28f7aa9
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/Julia.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/Julia.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/Julia.tmbundle updated: e2918776e1...443f9e8689
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/MagicPython
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/MagicPython updated: a605599caf...b75b17bf8e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimeBrainfuck
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimeBrainfuck
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimeBrainfuck updated: 571332e465...4fda534b0e
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimeClarion
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimeClarion
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimeClarion updated: 5823e7f447...750afa2b2a
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/SublimeEthereum
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/SublimeEthereum added at b506140321
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimePapyrus
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimePapyrus updated: aaef57c245...6dc86d921a
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/SublimePuppet
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/SublimePuppet
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/SublimePuppet updated: a90d5a4e08...c18abfbf2b
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/TXL
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/TXL
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/TXL updated: c1c98dfa86...614cf83649
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/Terraform.tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/Terraform.tmLanguage
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/Terraform.tmLanguage added at 85c3f54f85
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/applescript.tmbundle
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/applescript.tmbundle
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/applescript.tmbundle updated: 5067ef67a5...df46dd96d8
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-fsharp
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-fsharp
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-fsharp updated: 4f9d5510f3...c875802334
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-1c-bsl
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-1c-bsl updated: 12edd3a54c...a7bfee99b4
									
								
							
							
								
								
									
										2
									
								
								vendor/grammars/atom-language-clean
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/grammars/atom-language-clean
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/grammars/atom-language-clean updated: 7dafe70ddd...67ce940eb2
									
								
							
							
								
								
									
										1
									
								
								vendor/grammars/atom-language-p4
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/atom-language-p4
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/atom-language-p4 added at 999e3af389
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user