blob: f7d22cbb5dd6cc8f57eb8e49f7dfa89cfa5362a5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Angelo Zerr <angelo.zerr@gmail.com> - copied from org.eclipse.wst.css.core.internal.formatter.StyleDeclarationFormatter
* modified in order to process JSON Objects.
*******************************************************************************/
package org.eclipse.wst.json.core.internal.format;
import org.eclipse.jface.text.IRegion;
import org.eclipse.wst.json.core.cleanup.IJSONCleanupStrategy;
import org.eclipse.wst.json.core.document.IJSONArray;
import org.eclipse.wst.json.core.document.IJSONNode;
import org.eclipse.wst.json.core.document.IJSONObject;
import org.eclipse.wst.json.core.document.IJSONPair;
import org.eclipse.wst.json.core.document.IJSONValue;
import org.eclipse.wst.json.core.regions.JSONRegionContexts;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
public class JSONPairFormatter extends JSONStructureFormatter {
private static AbstractJSONSourceFormatter instance;
JSONPairFormatter() {
super();
}
@Override
protected void formatChildren(IJSONNode node, StringBuilder source) {
if (node instanceof IJSONPair) {
IJSONPair pair = (IJSONPair) node;
IJSONValue value = pair.getValue();
if (value instanceof IJSONObject || value instanceof IJSONArray) {
formatObject(node, source, value);
} else {
formatValue(node, source, value);
}
}
}
@Override
protected void formatChildren(IJSONNode node, IRegion region, StringBuilder source) {
IJSONNode child = node.getFirstChild();
int start = region.getOffset();
int end = region.getOffset() + region.getLength();
while (child != null) {
int curEnd = child.getEndOffset();
StringBuilder childSource = null;
boolean toFinish = false;
if (start < curEnd) {
int curStart = child.getStartOffset();
if (curStart < end) {
// append child
IJSONSourceFormatter formatter = (IJSONSourceFormatter) ((INodeNotifier) child)
.getAdapterFor(IJSONSourceFormatter.class);
if (formatter == null) {
formatter = JSONSourceFormatterFactory.getInstance().getSourceFormatter(child);
}
if (includes(region, curStart, curEnd))
childSource = ((AbstractJSONSourceFormatter) formatter).formatProc(child);
else
childSource = ((AbstractJSONSourceFormatter) formatter).formatProc(child,
overlappedRegion(region, curStart, curEnd));
} else
toFinish = true;
}
if (childSource != null) {
source.append(childSource);
}
if (toFinish)
break;
child = child.getNextSibling();
}
}
@Override
protected void formatPre(IJSONNode node, StringBuilder source) {
formatPre(node, new FormatRegion(node.getStartOffset(), node.getEndOffset() - node.getStartOffset()), source);
}
@Override
protected void formatPre(IJSONNode node, IRegion region, StringBuilder source) {
IJSONCleanupStrategy stgy = getCleanupStrategy(node);
IStructuredDocument structuredDocument = node.getOwnerDocument().getModel().getStructuredDocument();
CompoundRegion[] regions = getRegionsWithoutWhiteSpaces(structuredDocument, region, stgy);
int length = (regions.length >= 2) ? 2 : regions.length;
for (int i = 0; i < length; i++) {
source.append(decoratedRegion(regions[i], 0, stgy));
if (regions[i].getType() == JSONRegionContexts.JSON_COLON) {
source.append(' ');
}
}
}
@Override
protected void formatPost(IJSONNode node, IRegion region, StringBuilder source) {
if (node.getNextSibling() != null) {
int start = node.getEndOffset();
int end = node.getNextSibling().getStartOffset();
IJSONCleanupStrategy stgy = getCleanupStrategy(node);
IStructuredDocument structuredDocument = node.getOwnerDocument().getModel().getStructuredDocument();
CompoundRegion[] regions = getRegionsWithoutWhiteSpaces(structuredDocument,
new FormatRegion(start, end - start), stgy);
for (int i = 0; i < regions.length; i++) {
source.append(decoratedRegion(regions[i], 0, stgy));
}
String delim = getLineDelimiter(node);
source.append(delim);
if (node.getNextSibling() != null) {
source.append(getIndent(node));
} else {
source.append(getIndent(node.getParentNode()));
}
}
}
@Override
protected void formatPost(IJSONNode node, StringBuilder source) {
formatPost(node, new FormatRegion(node.getStartOffset(), node.getEndOffset() - node.getStartOffset()), source);
}
public synchronized static AbstractJSONSourceFormatter getInstance() {
if (instance == null)
instance = new JSONPairFormatter();
return instance;
}
}