blob: e77b337e70750c2bea4a09664b327bc1560a6a09 [file] [log] [blame] [raw]
RabsRincon6ef87b52018-02-27 14:58:21 +01001// Copyright (c) 2017, Matt Godbolt & Rubén Rincón
RabsRincona8763c32017-12-03 23:37:16 +01002// 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
RabsRincon8242db32018-07-09 14:04:36 +020025/***
26 * Language object type
27 *
28 * @typedef {Object} CELanguage
RabsRincon8ec2e092018-07-09 14:09:57 +020029 * @property {string} id - Id of language. Added programmatically based on CELanguages key
RabsRincon8242db32018-07-09 14:04:36 +020030 * @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 */
RabsRincona8763c32017-12-03 23:37:16 +010035
RabsRincon8242db32018-07-09 14:04:36 +020036/***
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 */
RabsRincon43279a62017-12-09 11:19:45 +010046const languages = {
47 'c++': {
RabsRincon43279a62017-12-09 11:19:45 +010048 name: 'C++',
49 monaco: 'cppp',
RabsRincon43bca162018-01-05 20:56:19 +010050 extensions: ['.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'],
RabsRinconbdc447f2018-08-20 11:10:23 +020051 alias: ['gcc', 'cpp'],
52 previewFilter: /^\s*#include/
RabsRincon43279a62017-12-09 11:19:45 +010053 },
Adrian Bibby Walther5e1245c2018-02-26 13:24:11 +010054 llvm: {
Adrian Bibby Walther5e1245c2018-02-26 13:24:11 +010055 name: 'LLVM IR',
Andre Meyering848e84f2018-10-14 17:01:29 +020056 monaco: 'llvm-ir',
Adrian Bibby Walther5e1245c2018-02-26 13:24:11 +010057 extensions: ['.ll'],
58 alias: []
59 },
RabsRincon43279a62017-12-09 11:19:45 +010060 cppx: {
RabsRincon43279a62017-12-09 11:19:45 +010061 name: 'Cppx',
62 monaco: 'cppp',
RabsRincon43bca162018-01-05 20:56:19 +010063 extensions: ['.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'],
RabsRinconbdc447f2018-08-20 11:10:23 +020064 alias: [],
65 previewFilter: /^\s*#include/
RabsRincon43279a62017-12-09 11:19:45 +010066 },
RabsRinconb44c27a2018-01-13 18:58:53 +010067 c: {
RabsRincon43279a62017-12-09 11:19:45 +010068 name: 'C',
RabsRincond1a7c9f2018-09-08 13:22:14 +020069 monaco: 'nc',
RabsRinconb44c27a2018-01-13 18:58:53 +010070 extensions: ['.c', '.h'],
RabsRinconbdc447f2018-08-20 11:10:23 +020071 alias: [],
72 previewFilter: /^\s*#include/
RabsRinconb44c27a2018-01-13 18:58:53 +010073 },
RabsRincon43279a62017-12-09 11:19:45 +010074 rust: {
RabsRincon43279a62017-12-09 11:19:45 +010075 name: 'Rust',
76 monaco: 'rust',
RabsRincon43bca162018-01-05 20:56:19 +010077 extensions: ['.rs'],
78 alias: []
RabsRincon43279a62017-12-09 11:19:45 +010079 },
80 d: {
RabsRincon43279a62017-12-09 11:19:45 +010081 name: 'D',
82 monaco: 'd',
RabsRincon43bca162018-01-05 20:56:19 +010083 extensions: ['.d'],
84 alias: []
RabsRincon43279a62017-12-09 11:19:45 +010085 },
86 go: {
RabsRincon43279a62017-12-09 11:19:45 +010087 name: 'Go',
88 monaco: 'go',
RabsRincon43bca162018-01-05 20:56:19 +010089 extensions: ['.go'],
90 alias: []
RabsRincon43279a62017-12-09 11:19:45 +010091 },
92 ispc: {
RabsRincon43279a62017-12-09 11:19:45 +010093 name: 'ispc',
94 monaco: 'ispc',
RabsRincon43bca162018-01-05 20:56:19 +010095 extensions: ['.ispc'],
96 alias: []
RabsRincon43279a62017-12-09 11:19:45 +010097 },
98 haskell: {
RabsRincon43279a62017-12-09 11:19:45 +010099 name: 'Haskell',
100 monaco: 'haskell',
RabsRincon43bca162018-01-05 20:56:19 +0100101 extensions: ['.hs', '.haskell'],
102 alias: []
RabsRincon43279a62017-12-09 11:19:45 +0100103 },
Matt Godbolt366add62019-06-10 22:56:42 -0500104 // Temporarily disabled: see #1438
105 // java: {
106 // name: 'Java',
107 // monaco: 'java',
108 // extensions: ['.java'],
109 // alias: []
110 // },
Freyr7e1b4542018-12-15 21:31:15 +0300111 ocaml: {
112 name: 'OCaml',
113 monaco: 'ocaml',
114 extensions: ['.ml', '.mli'],
115 alias: []
116 },
RabsRincon43279a62017-12-09 11:19:45 +0100117 swift: {
RabsRincon43279a62017-12-09 11:19:45 +0100118 name: 'Swift',
119 monaco: 'swift',
RabsRincon43bca162018-01-05 20:56:19 +0100120 extensions: ['.swift'],
121 alias: []
RabsRincon43279a62017-12-09 11:19:45 +0100122 },
123 pascal: {
RabsRincon43279a62017-12-09 11:19:45 +0100124 name: 'Pascal',
125 monaco: 'pascal',
RabsRincon43bca162018-01-05 20:56:19 +0100126 extensions: ['.pas'],
127 alias: []
partouf404a9c12018-01-06 07:23:28 +0100128 },
dbroemmel12dbaf32018-06-05 11:26:15 +0000129 fortran: {
130 id: 'fortran',
131 name: 'Fortran',
132 monaco: 'fortran',
133 extensions: ['.f90','.F90','.f95','.F95'],
134 alias: []
135 },
partouf404a9c12018-01-06 07:23:28 +0100136 assembly: {
partouf404a9c12018-01-06 07:23:28 +0100137 name: 'Assembly',
138 monaco: 'asm',
139 extensions: ['.asm'],
partouf1eb1d2b2018-01-06 16:06:01 +0100140 alias: ['asm']
Filipe Cabecinhasb929d422018-04-24 18:27:06 +0100141 },
142 analysis: {
Filipe Cabecinhasb929d422018-04-24 18:27:06 +0100143 name: 'Analysis',
144 monaco: 'asm',
145 extensions: ['.asm'], // maybe add more? Change to a unique one?
RabsRincon019a4df2018-05-29 18:15:51 +0200146 alias: ['tool', 'tools']
Matt Godboltac8d24a2018-05-07 18:22:58 -0500147 },
148 cuda: {
Matt Godboltac8d24a2018-05-07 18:22:58 -0500149 name: 'CUDA',
RabsRinconf85fe292018-05-09 15:18:34 +0200150 monaco: 'cuda',
Matt Godboltac8d24a2018-05-07 18:22:58 -0500151 extensions: ['.cu'],
Sebastian Staffaa36e23c2019-03-11 16:32:26 +0100152 alias: ['nvcc'],
153 monacoDisassembly: 'ptx'
Marc Tiehuisffd04ac2018-09-07 17:28:13 +1200154 },
155 zig: {
156 name: 'Zig',
157 monaco: 'zig',
158 extensions: ['.zig'],
159 alias: []
160 },
Partouf6a769c12018-10-06 13:58:59 +0200161 clean: {
162 name: 'Clean',
Partouf706f4082018-10-06 18:05:45 +0200163 monaco: 'clean',
Partouf6a769c12018-10-06 13:58:59 +0200164 extensions: ['.icl'],
165 alias: []
Mitch Kennedy8c370772018-11-17 17:54:18 +1100166 },
167 ada: {
168 name: 'Ada',
169 monaco: 'ada',
170 extensions: ['.adb', '.ads'],
171 alias: []
Partouf6a769c12018-10-06 13:58:59 +0200172 }
RabsRincon43279a62017-12-09 11:19:45 +0100173};
RabsRincona8763c32017-12-03 23:37:16 +0100174
RabsRincon43279a62017-12-09 11:19:45 +0100175const fs = require('fs-extra');
RabsRincon7c18ffe2018-06-15 15:04:55 +0200176const _ = require('underscore');
RabsRincon1afc9a82017-12-10 20:54:17 +0100177const path = require('path');
RabsRincon8ec2e092018-07-09 14:09:57 +0200178_.each(languages, (lang, key) => {
179 lang.id = key;
RabsRincon43279a62017-12-09 11:19:45 +0100180 try {
RabsRincon36c67812018-01-04 20:42:31 +0100181 lang.example = fs.readFileSync(path.join('examples', lang.id, 'default' + lang.extensions[0]), 'utf8');
RabsRincon43279a62017-12-09 11:19:45 +0100182 } catch (error) {
183 lang.example = "Oops, something went wrong and we could not get the default code for this language.";
184 }
185});
186
RabsRincona8763c32017-12-03 23:37:16 +0100187module.exports = {
RabsRincon43279a62017-12-09 11:19:45 +0100188 list: languages
RabsRincona8763c32017-12-03 23:37:16 +0100189};