RabsRincon | 6ef87b5 | 2018-02-27 14:58:21 +0100 | [diff] [blame] | 1 | // Copyright (c) 2017, Matt Godbolt & Rubén Rincón |
RabsRincon | a8763c3 | 2017-12-03 23:37:16 +0100 | [diff] [blame] | 2 | // All rights reserved. |
| 3 | // |
| 4 | // Redistribution and use in source and binary forms, with or without |
| 5 | // modification, are permitted provided that the following conditions are met: |
| 6 | // |
| 7 | // * Redistributions of source code must retain the above copyright notice, |
| 8 | // this list of conditions and the following disclaimer. |
| 9 | // * Redistributions in binary form must reproduce the above copyright |
| 10 | // notice, this list of conditions and the following disclaimer in the |
| 11 | // documentation and/or other materials provided with the distribution. |
| 12 | // |
| 13 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 14 | // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 15 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 16 | // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| 17 | // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 18 | // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 19 | // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 20 | // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 21 | // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 22 | // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 23 | // POSSIBILITY OF SUCH DAMAGE. |
| 24 | |
RabsRincon | 8242db3 | 2018-07-09 14:04:36 +0200 | [diff] [blame] | 25 | /*** |
| 26 | * Language object type |
| 27 | * |
| 28 | * @typedef {Object} CELanguage |
RabsRincon | 8ec2e09 | 2018-07-09 14:09:57 +0200 | [diff] [blame] | 29 | * @property {string} id - Id of language. Added programmatically based on CELanguages key |
RabsRincon | 8242db3 | 2018-07-09 14:04:36 +0200 | [diff] [blame] | 30 | * @property {string} name - UI display name of the language |
| 31 | * @property {string} monaco - Monaco Editor language ID (Selects which language Monaco will use to highlight the code) |
| 32 | * @property {string[]} extensions - Usual extensions associated with the language. First one is used as file input etx |
| 33 | * @property {string[]} alias - Different ways in which we can also refer to this language |
| 34 | */ |
RabsRincon | a8763c3 | 2017-12-03 23:37:16 +0100 | [diff] [blame] | 35 | |
RabsRincon | 8242db3 | 2018-07-09 14:04:36 +0200 | [diff] [blame] | 36 | /*** |
| 37 | * Currently supported languages on Compiler Explorer |
| 38 | * |
| 39 | * @typedef {Object.<string, CELanguage>} CELanguages |
| 40 | */ |
| 41 | |
| 42 | /*** |
| 43 | * Current supported languages |
| 44 | * @type {CELanguages} |
| 45 | */ |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 46 | const languages = { |
| 47 | 'c++': { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 48 | name: 'C++', |
| 49 | monaco: 'cppp', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 50 | extensions: ['.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'], |
RabsRincon | bdc447f | 2018-08-20 11:10:23 +0200 | [diff] [blame] | 51 | alias: ['gcc', 'cpp'], |
| 52 | previewFilter: /^\s*#include/ |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 53 | }, |
Adrian Bibby Walther | 5e1245c | 2018-02-26 13:24:11 +0100 | [diff] [blame] | 54 | llvm: { |
Adrian Bibby Walther | 5e1245c | 2018-02-26 13:24:11 +0100 | [diff] [blame] | 55 | name: 'LLVM IR', |
Andre Meyering | 848e84f | 2018-10-14 17:01:29 +0200 | [diff] [blame] | 56 | monaco: 'llvm-ir', |
Adrian Bibby Walther | 5e1245c | 2018-02-26 13:24:11 +0100 | [diff] [blame] | 57 | extensions: ['.ll'], |
| 58 | alias: [] |
| 59 | }, |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 60 | cppx: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 61 | name: 'Cppx', |
| 62 | monaco: 'cppp', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 63 | extensions: ['.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'], |
RabsRincon | bdc447f | 2018-08-20 11:10:23 +0200 | [diff] [blame] | 64 | alias: [], |
| 65 | previewFilter: /^\s*#include/ |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 66 | }, |
RabsRincon | b44c27a | 2018-01-13 18:58:53 +0100 | [diff] [blame] | 67 | c: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 68 | name: 'C', |
RabsRincon | d1a7c9f | 2018-09-08 13:22:14 +0200 | [diff] [blame] | 69 | monaco: 'nc', |
RabsRincon | b44c27a | 2018-01-13 18:58:53 +0100 | [diff] [blame] | 70 | extensions: ['.c', '.h'], |
RabsRincon | bdc447f | 2018-08-20 11:10:23 +0200 | [diff] [blame] | 71 | alias: [], |
| 72 | previewFilter: /^\s*#include/ |
RabsRincon | b44c27a | 2018-01-13 18:58:53 +0100 | [diff] [blame] | 73 | }, |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 74 | rust: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 75 | name: 'Rust', |
| 76 | monaco: 'rust', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 77 | extensions: ['.rs'], |
| 78 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 79 | }, |
| 80 | d: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 81 | name: 'D', |
| 82 | monaco: 'd', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 83 | extensions: ['.d'], |
| 84 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 85 | }, |
| 86 | go: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 87 | name: 'Go', |
| 88 | monaco: 'go', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 89 | extensions: ['.go'], |
| 90 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 91 | }, |
| 92 | ispc: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 93 | name: 'ispc', |
| 94 | monaco: 'ispc', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 95 | extensions: ['.ispc'], |
| 96 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 97 | }, |
| 98 | haskell: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 99 | name: 'Haskell', |
| 100 | monaco: 'haskell', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 101 | extensions: ['.hs', '.haskell'], |
| 102 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 103 | }, |
Matt Godbolt | 366add6 | 2019-06-10 22:56:42 -0500 | [diff] [blame] | 104 | // Temporarily disabled: see #1438 |
| 105 | // java: { |
| 106 | // name: 'Java', |
| 107 | // monaco: 'java', |
| 108 | // extensions: ['.java'], |
| 109 | // alias: [] |
| 110 | // }, |
Freyr | 7e1b454 | 2018-12-15 21:31:15 +0300 | [diff] [blame] | 111 | ocaml: { |
| 112 | name: 'OCaml', |
| 113 | monaco: 'ocaml', |
| 114 | extensions: ['.ml', '.mli'], |
| 115 | alias: [] |
| 116 | }, |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 117 | swift: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 118 | name: 'Swift', |
| 119 | monaco: 'swift', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 120 | extensions: ['.swift'], |
| 121 | alias: [] |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 122 | }, |
| 123 | pascal: { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 124 | name: 'Pascal', |
| 125 | monaco: 'pascal', |
RabsRincon | 43bca16 | 2018-01-05 20:56:19 +0100 | [diff] [blame] | 126 | extensions: ['.pas'], |
| 127 | alias: [] |
partouf | 404a9c1 | 2018-01-06 07:23:28 +0100 | [diff] [blame] | 128 | }, |
dbroemmel | 12dbaf3 | 2018-06-05 11:26:15 +0000 | [diff] [blame] | 129 | fortran: { |
| 130 | id: 'fortran', |
| 131 | name: 'Fortran', |
| 132 | monaco: 'fortran', |
| 133 | extensions: ['.f90','.F90','.f95','.F95'], |
| 134 | alias: [] |
| 135 | }, |
partouf | 404a9c1 | 2018-01-06 07:23:28 +0100 | [diff] [blame] | 136 | assembly: { |
partouf | 404a9c1 | 2018-01-06 07:23:28 +0100 | [diff] [blame] | 137 | name: 'Assembly', |
| 138 | monaco: 'asm', |
| 139 | extensions: ['.asm'], |
partouf | 1eb1d2b | 2018-01-06 16:06:01 +0100 | [diff] [blame] | 140 | alias: ['asm'] |
Filipe Cabecinhas | b929d42 | 2018-04-24 18:27:06 +0100 | [diff] [blame] | 141 | }, |
| 142 | analysis: { |
Filipe Cabecinhas | b929d42 | 2018-04-24 18:27:06 +0100 | [diff] [blame] | 143 | name: 'Analysis', |
| 144 | monaco: 'asm', |
| 145 | extensions: ['.asm'], // maybe add more? Change to a unique one? |
RabsRincon | 019a4df | 2018-05-29 18:15:51 +0200 | [diff] [blame] | 146 | alias: ['tool', 'tools'] |
Matt Godbolt | ac8d24a | 2018-05-07 18:22:58 -0500 | [diff] [blame] | 147 | }, |
| 148 | cuda: { |
Matt Godbolt | ac8d24a | 2018-05-07 18:22:58 -0500 | [diff] [blame] | 149 | name: 'CUDA', |
RabsRincon | f85fe29 | 2018-05-09 15:18:34 +0200 | [diff] [blame] | 150 | monaco: 'cuda', |
Matt Godbolt | ac8d24a | 2018-05-07 18:22:58 -0500 | [diff] [blame] | 151 | extensions: ['.cu'], |
Sebastian Staffa | a36e23c | 2019-03-11 16:32:26 +0100 | [diff] [blame] | 152 | alias: ['nvcc'], |
| 153 | monacoDisassembly: 'ptx' |
Marc Tiehuis | ffd04ac | 2018-09-07 17:28:13 +1200 | [diff] [blame] | 154 | }, |
| 155 | zig: { |
| 156 | name: 'Zig', |
| 157 | monaco: 'zig', |
| 158 | extensions: ['.zig'], |
| 159 | alias: [] |
| 160 | }, |
Partouf | 6a769c1 | 2018-10-06 13:58:59 +0200 | [diff] [blame] | 161 | clean: { |
| 162 | name: 'Clean', |
Partouf | 706f408 | 2018-10-06 18:05:45 +0200 | [diff] [blame] | 163 | monaco: 'clean', |
Partouf | 6a769c1 | 2018-10-06 13:58:59 +0200 | [diff] [blame] | 164 | extensions: ['.icl'], |
| 165 | alias: [] |
Mitch Kennedy | 8c37077 | 2018-11-17 17:54:18 +1100 | [diff] [blame] | 166 | }, |
| 167 | ada: { |
| 168 | name: 'Ada', |
| 169 | monaco: 'ada', |
| 170 | extensions: ['.adb', '.ads'], |
| 171 | alias: [] |
Partouf | 6a769c1 | 2018-10-06 13:58:59 +0200 | [diff] [blame] | 172 | } |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 173 | }; |
RabsRincon | a8763c3 | 2017-12-03 23:37:16 +0100 | [diff] [blame] | 174 | |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 175 | const fs = require('fs-extra'); |
RabsRincon | 7c18ffe | 2018-06-15 15:04:55 +0200 | [diff] [blame] | 176 | const _ = require('underscore'); |
RabsRincon | 1afc9a8 | 2017-12-10 20:54:17 +0100 | [diff] [blame] | 177 | const path = require('path'); |
RabsRincon | 8ec2e09 | 2018-07-09 14:09:57 +0200 | [diff] [blame] | 178 | _.each(languages, (lang, key) => { |
| 179 | lang.id = key; |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 180 | try { |
RabsRincon | 36c6781 | 2018-01-04 20:42:31 +0100 | [diff] [blame] | 181 | lang.example = fs.readFileSync(path.join('examples', lang.id, 'default' + lang.extensions[0]), 'utf8'); |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 182 | } catch (error) { |
| 183 | lang.example = "Oops, something went wrong and we could not get the default code for this language."; |
| 184 | } |
| 185 | }); |
| 186 | |
RabsRincon | a8763c3 | 2017-12-03 23:37:16 +0100 | [diff] [blame] | 187 | module.exports = { |
RabsRincon | 43279a6 | 2017-12-09 11:19:45 +0100 | [diff] [blame] | 188 | list: languages |
RabsRincon | a8763c3 | 2017-12-03 23:37:16 +0100 | [diff] [blame] | 189 | }; |